我一直在尝试渲染具有正方形纹理的GL_QUAD(形状为梯形)。我想尝试并仅使用OpenGL来实现这一点。现在,纹理变得严重变形,这确实很烦人。
通常,我将加载纹理以计算单应性,但这意味着大量工作和附加的线性编程库/直接线性变换功能。我的印象是OpenGL可以为我简化此过程。
我浏览了网上,看到了"Perspective-Correct Texturing, Q Coordinates, and GLSL"和"Skewed/Sheared Texture Mapping in OpenGL"。
所有这些似乎都假设您将执行某种类型的单应性计算或使用我不知道的OpenGL的某些部分...有什么建议吗?
更新:
我一直在阅读"Navigating Static Environments Using Image-Space Simplification and Morphing" [PDF]-第9页附录A。
好像他们通过将(s,t,r,q)纹理坐标与模型的世界空间z分量的顶点相乘来禁用透视校正。
因此,对于形状为梯形的四边形,对于给定的纹理坐标(s,r,t,q),其中4个分量是:
(0.0f, 0.0f, 0.0f, 1.0f),
(0.0f, 1.0f, 0.0f, 1.0f),
(1.0f, 1.0f, 0.0f, 1.0f),
(1.0f, 0.0f, 0.0f, 1.0f)
这和glTexCoord4f(svert.z,rvert.z,t,q * vert.z)一样容易吗?还是我错过了一些步骤?喜欢弄乱GL_TEXTURE glMatrixMode吗?
更新#2:
做到了!谨记大家,这个问题遍布整个网络,而且没有任何简单的答案。最复杂的方法是直接用原始形状和变换形状之间的单应性重新计算纹理,也就是很多线性代数和外部BLAS lib依赖性。
最佳答案
这是问题和解决方案的很好的解释。
http://www.xyzw.us/~cass/qcoord/
工作链接:http://replay.web.archive.org/20080209130648/http://www.r3.nu/~cass/qcoord/
部分复制并改编自上述链接,由Cass创建
纹理映射更有趣的方面之一是纹理坐标所居住的空间。我们大多数人喜欢将纹理空间视为简单的2D仿射平面。在大多数情况下,这是完全可以接受的,并且非常直观,但是有时会出现问题。
例如,假设您有一个四边形,其空间坐标为梯形,但纹理坐标为正方形。
OpenGL将四边形划分为三角形,并计算纹理坐标的斜率(ds / dx,ds / dy,dt / dx,dt / dy),并使用其在多边形内部插值纹理坐标。对于左下三角形,dx = 1且ds = 1,但对于右上三角形,dx
即使我们通常不考虑r = 0和q = 1defaults,纹理空间也不只是2D仿射平面。这确实是一个完整的投影空间(P3)!这很好,因为我们可以将它们指定为(s,t,r,q)坐标,而不是将上层顶点的纹理坐标指定为(0,1)和(1,1)的(s,t)坐标。 (0,width,0,width)和(width,width,0,width)中的一个!这些坐标对应于纹理图像中的相同位置,但是请看一下ds / dx发生了什么-现在两个三角形都相同了!它们都具有相同的dq / dx和dq / dy。
请注意,它仍然在z = 0平面中。当将此技术与透视相机投影一起使用时,会变得非常混乱,因为这会产生“错误的深度感知”。不过,它可能比仅使用(s,t)更好。那是你决定的。