我一直在尝试渲染一个方形纹理的GL_QUAD(形状为梯形)。我想尝试使用OpenGL来完成这个。现在纹理变得严重扭曲,这真的很烦人。
通常情况下,我会加载纹理计算,但这意味着大量的工作和额外的线性编程库/直接线性变换函数。我觉得OpenGL可以为我简化这个过程。
我在网上看了看,看到了"透视正确纹理,Q坐标和GLSL"one_answers"OpenGL中的倾斜/剪切纹理映射"。
这些似乎都假设你会做一些类型的同形运算或使用一些我不知道的OpenGL的部分…任何建议吗?
更新:
我一直在阅读"使用图像空间简化和变形导航静态环境"[PDF] -第9页附录a。
看起来他们通过将(s,t,r,q)纹理坐标与模型的世界空间z组件的顶点相乘来禁用透视校正。
对于一个给定的纹理坐标(s, r, t, q)对于一个形状为梯形的四边形,其中四个分量是:
(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, r 绿色。Z, t, q*v。Z)?还是我漏了什么步骤?像搞乱GL_TEXTURE glMatrixMode?
更新# 2:
成功了!请记住,这个问题在网上到处都是,没有简单的答案。大多数涉及直接重新计算纹理与原始形状和转换形状之间的单应性…也就是大量的线性代数和外部BLAS库依赖。
对这个问题有一个很好的解释& &;解决方案。
http://www.xyzw.us/卡斯/qcoord/
工作链接:http://replay.web.archive.org/20080209130648/http://www.r3.nu/~cass/qcoord/
部分复制和改编自上面的链接,由Cass创建
纹理映射的一个更有趣的方面是纹理坐标所在的空间。我们大多数人都喜欢把纹理空间想象成一个简单的二维仿射平面。在大多数情况下,这是完全可以接受的,而且非常直观,但有时会出现问题。
例如,假设你有一个四边形,它的空间坐标是梯形的,但它的纹理坐标是正方形的。
OpenGL将四边形划分为三角形,并计算纹理坐标的斜率(ds/dx, ds/dy, dt/dx, dt/dy),并使用这些来插值纹理坐标在多边形的内部。对于左下三角形,dx = 1, ds = 1,但对于右上三角形,dx <当ds>
纹理空间不是简单的二维仿射平面,即使我们通常保留r=0和q=1默认值。这是一个完全的投影空间(P3)!这很好,因为我们可以将上面顶点的纹理坐标指定为(s,t)坐标(0,1)和(1,1),而不是将它们指定为(s,t,r,q)坐标(0,width, 0, width)和(width, width, 0, width)!这些坐标对应于纹理图像中的相同位置,但看看ds/dx发生了什么-现在两个三角形都是一样的!!它们都有相同的dq/dx和dq/dy。
注意它仍然在z=0平面上。当使用这种技术与透视相机投影时,它会变得非常混乱,因为这会产生"错误的深度感知"。尽管如此,它可能比只使用(s,t)要好。那由你来决定。
当ds>
我猜大多数想要在梯形上适合矩形纹理的人都在考虑两种结果之一:
- 透视投影:梯形从斜角看像一个矩形。
- "拉伸"变形:梯形看起来像一块被拉伸/收缩成形状的矩形橡胶。
关于SO的大多数解决方案属于第一组,而我最近发现自己属于第二组。
我发现达到效果2的最简单的方法。就是把梯形分成长方形和直角三角形。在我的例子中,梯形是正的,所以一个四边形和两个三角形解决了这个问题。
希望能有所帮助:引自论文:"在每个像素上,使用插值值(s=w;t = w;r = w;Q =w), yield (s= Q;t =问)是最终的纹理坐标。要禁用此效果,这不是可以直接在OpenGL中实现。"
在GLSL中,(至少现在)这是可能的。您可以添加:
noperspective out vec4;
有一个解释:https://www.geeks3d.com/20130514/opengl-interpolation-qualifiers-glsl-tutorial/