我正在尝试编码正确的二维仿射纹理MapGLSL。
说明:
...这些图像中没有一个对我的目的是正确的。右(标记为正确)有透视校正,我不想。所以这:Getting to know the Q texture coordinate解决方案(没有进一步改进)不是我想要的。
我想简单地“拉伸”四边形内部的纹理,像这样:
而是由两个三角形组成的。2有什么建议吗?
我正在尝试编码正确的二维仿射纹理MapGLSL。
说明:
...这些图像中没有一个对我的目的是正确的。右(标记为正确)有透视校正,我不想。所以这:Getting to know the Q texture coordinate解决方案(没有进一步改进)不是我想要的。
我想简单地“拉伸”四边形内部的纹理,像这样:
而是由两个三角形组成的。2有什么建议吗?
7条答案
按热度按时间rnmwe5a21#
只要你有一个梯形,并且它的平行边与一个局部轴对齐,这个方法就可以很好地工作。
GLSL:
C#:
ih99xse12#
我最近设法想出了一个通用的解决这个问题的任何类型的四边形。计算和GLSL可能会有帮助。有一个工作演示在java(运行在Android),但紧凑和可读,应该很容易移植到统一或iOS:http://www.bitlush.com/posts/arbitrary-quadrilaterals-in-opengl-es-2-0
hxzsmxv23#
如果还有人感兴趣的话,这里有一个C#实现,它取一个由顺时针屏幕顶点(x 0,y 0)(x1,y1)...(x3,y3)定义的四边形,一个位于(x,y)的任意像素,并计算该像素的u和v。它最初是为了将一个任意四边形渲染为一个纹理而编写的,但很容易将该算法拆分为CPU、顶点和像素着色器;我已经在代码中相应地进行了注解。
qvsjd97n4#
细分四边形顶点可以增加插值像素的提示。
查看此链接。https://www.youtube.com/watch?v=8TleepxIORU&feature=youtu.be
mv1qrgav5#
我也有类似的问题(https://gamedev.stackexchange.com/questions/174857/mapping-a-texture-to-a-2d-quadrilateral/174871),在gamedev他们建议使用假想的Z坐标,我使用下面的C代码计算,它似乎在一般情况下工作(不仅仅是梯形):
我用软件来缩放和旋转2D精灵,而对于OpenGL 3D应用程序,你需要在像素/片段着色器中进行,除非你能够将这些想象中的az,bz,cz,dzMap到你实际的3D空间,并使用通常的管道。DMGregory给出了OpenGL着色器的确切代码:https://gamedev.stackexchange.com/questions/148082/how-can-i-fix-zig-zagging-uv-mapping-artifacts-on-a-generated-mesh-that-tapers
kd3sttzy6#
当我尝试在OpenGL中实现homography warping时,我遇到了这个问题。我发现的一些解决方案依赖于深度的概念,但这在我的情况下是不可行的,因为我正在处理2D坐标。我的解决方案基于this article。它似乎适用于我可以尝试的所有情况。我把它留在这里,以防它对其他人有用,因为我找不到类似的东西。解决方案做出以下假设:
将纹理坐标传递给着色器(使用vec 3)。然后:
brtdzjyr7#
谢谢你的回答,但是经过实验我找到了一个解决办法。
左边的两个三角形具有根据this的UV(strq),右边的两个三角形是该透视校正的修改版本。
数字和着色器:
使用此glsl着色器仅渲染直角三角形(左侧为固定管道):
所以只有U是透视的V是线性的