ct_*_*ct_ 10 opengl texture-mapping
我一直在尝试使用方形纹理渲染GL_QUAD(形状为梯形).我想尝试使用OpenGL来解决这个问题.现在纹理变得严重扭曲,这真的很烦人.
通常情况下,我会加载纹理计算单应性,但这意味着大量的工作和额外的线性编程库/直接线性变换函数.我的印象是OpenGL可以为我简化这个过程.
我环顾网络,看过"透视 - 正确纹理,Q坐标和GLSL"和"OpenGL中的倾斜/剪切纹理映射".
这些似乎都假设你会做某种类型的单应性计算或使用OpenGL的某些部分我不知道......任何建议?
更新:
我一直在阅读"使用图像空间简化和变形导航静态环境" [ 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)
Run Code Online (Sandbox Code Playgroud)
这和glTexCoord4f(s vert.z,r vert.z,t,q*vert.z)一样简单吗?或者我错过了一些步骤?喜欢弄乱GL_TEXTURE glMatrixMode?
更新#2:
这就是诀窍!记住这一点,这个问题遍布整个网络,并没有任何简单的答案.大多数涉及直接重新计算纹理与原始形状和变换形状之间的单应性...也就是大量的线性代数和外部BLAS lib依赖.
gog*_*ger 12
这是对问题和解决方案的一个很好的解释.
http://www.xyzw.us/~cass/qcoord/
部分复制并改编自上述链接,由Cass创建
纹理贴图的一个更有趣的方面是纹理坐标所处的空间.我们大多数人都喜欢将纹理空间看作一个简单的2D仿射平面.在大多数情况下,这是完全可以接受的,而且非常直观,但有时会出现问题.
例如,假设您的四边形在其空间坐标中是梯形的,但在其纹理坐标中是方形的.
OpenGL将四边形划分为三角形并计算纹理坐标的斜率(ds/dx,ds/dy,dt/dx,dt/dy),并使用这些坐标在多边形内部插入纹理坐标.对于左下角三角形,dx = 1且ds = 1,但对于右上角三角形,dx <1,而ds = 1.这使得右上三角形的ds/dx大于下一个三角形的ds/dx.这在纹理映射时产生令人不愉快的图像.
纹理空间不仅仅是2D仿射平面,即使我们通常单独留下r = 0和q = 1个缺陷.它真的是一个完整的投射空间(P3)!这很好,因为我们不是将上顶点的纹理坐标指定为(0,1)和(1,1)的(s,t)坐标,而是将它们指定为(s,t,r,q)坐标(0,宽度,0,宽度)和(宽度,宽度,0,宽度)!这些坐标对应于纹理图像中的相同位置,但是看看ds/dx发生了什么 - 现在两个三角形都相同!它们都具有相同的dq/dx和dq/dy.
请注意,它仍然在z = 0平面中.当使用这种技术与透视摄像机投影时,由于其产生的"错误深度感知",它可能变得非常混乱.不过,它可能比仅使用(s,t)更好.那是你决定的.