纹理在OpenGL中映射具有方形纹理的梯形

时间:2011-05-05 02:52:09

标签: opengl texture-mapping quad

我一直在尝试使用方形纹理渲染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一样简单(s vert.z,r vert.z,t,q * vert.z)?或者我错过了一些步骤?喜欢弄乱GL_TEXTURE glMatrixMode?

更新#2:

这就是诀窍!记住这一点,这个问题遍布整个网络,并没有任何简单的答案。大多数涉及直接重新计算纹理与原始形状和变换形状之间的单应性...也就是大量的线性代数和外部BLAS lib依赖。

3 个答案:

答案 0 :(得分:11)

以下是对该问题的一个很好的解释。解。

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)更好。那是由你来决定的。

答案 1 :(得分:0)

我猜大多数想要在梯形上设置矩形纹理的人都在想两个结果中的一个:

  1. 透视投影:梯形看起来像一个从斜角看到的矩形。
  2. “弹性”变形:梯形看起来像一块长方形的橡胶,已被拉伸/收缩成形。
  3. SO上的大多数解决方案属于第一组,而我最近发现自己处于第二组。

    我发现实现效果2的最简单方法是将梯形分割为矩形和直角三角形。在我的例子中,梯形是规则的,因此四个和两个三角形解决了这个问题。

答案 2 :(得分:0)

希望这可以帮助: 引用本文: ” 在每个像素处,使用(s = w; t = w; r = w; q = w)的插值执行除法,得出(s = q; t = q), 是最终的纹理坐标。要禁用此效果,这不是 直接在OpenGL中实现。 “

在GLSL中(至少现在),这是可能的。您可以添加:

不希望看到vec4 v_TexCoord;

有一个解释: https://www.geeks3d.com/20130514/opengl-interpolation-qualifiers-glsl-tutorial/