在OpenGL中用正方形纹理映射一个梯形



我一直在尝试渲染一个方形纹理的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)要好。那由你来决定。

我猜大多数想要在梯形上适合矩形纹理的人都在考虑两种结果之一:

  1. 透视投影:梯形从斜角看像一个矩形。
  2. "拉伸"变形:梯形看起来像一块被拉伸/收缩成形状的矩形橡胶。

关于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/

最新更新