OpenGL中带有方形纹理的梯形纹理映射

OpenGL中带有方形纹理的梯形纹理映射,opengl,texture-mapping,Opengl,Texture Mapping,我一直在尝试用正方形纹理渲染一个GL_四边形(形状为梯形)。我想尝试使用OpenGL来实现这一点。现在,纹理变得严重扭曲,真的很烦人 通常,我会加载纹理计算单应性,但这意味着大量工作和额外的线性编程库/直接线性变换函数。我觉得OpenGL可以为我简化这个过程 我环顾了一下网络,看到了,也看到了 这些似乎都假设您将进行某种类型的单应计算或使用OpenGL的某些部分,我对此一无所知。。。有什么建议吗 更新: 我一直在阅读第9页附录A 看起来他们通过将(s、t、r、q)纹理坐标与模型的世界空间z组件的

我一直在尝试用正方形纹理渲染一个GL_四边形(形状为梯形)。我想尝试使用OpenGL来实现这一点。现在,纹理变得严重扭曲,真的很烦人

通常,我会加载纹理计算单应性,但这意味着大量工作和额外的线性编程库/直接线性变换函数。我觉得OpenGL可以为我简化这个过程

我环顾了一下网络,看到了,也看到了

这些似乎都假设您将进行某种类型的单应计算或使用OpenGL的某些部分,我对此一无所知。。。有什么建议吗

更新:

我一直在阅读第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_纹理glMatrixMode

更新#2:


成功了!大家记住,这个问题在网络上到处都是,没有任何简单的答案。大多数涉及到直接使用原始形状和变换形状之间的单应性重新计算纹理…即大量线性代数和外部BLAS lib依赖项。

这里是问题和解决方案的一个很好的解释

工作链接:

部分复制和改编自上述链接,由卡斯创建

纹理贴图的一个更有趣的方面是纹理坐标所在的空间。我们大多数人都喜欢将纹理空间看作一个简单的二维仿射平面。在大多数情况下,这是完全可以接受的,而且非常直观,但有时会出现问题

例如,假设有一个四边形,其空间坐标为梯形,而纹理坐标为正方形

OpenGL将把四边形分割成三角形,计算纹理坐标的斜率(ds/dx、ds/dy、dt/dx、dt/dy),并使用这些斜率在多边形内部插值纹理坐标。对于左下三角形,dx=1和ds=1,但对于右上三角形,dx<1,而ds=1。这使得右上三角形的ds/dx大于右下三角形的ds/dx。这会在纹理贴图时生成令人不快的图像

纹理空间不仅仅是一个二维仿射平面,即使我们通常不考虑r=0和q=1的默认值。这真是一个完整的投影空间(P3)!这很好,因为不必将上部顶点的纹理坐标指定为(s,t)坐标(0,1)和(1,1),我们可以将它们指定为(s,t,r,q)坐标(0,宽度,0,宽度)和(宽度,宽度,0,宽度)!这些坐标对应于纹理图像中的相同位置,但看看ds/dx发生了什么-现在两个三角形的坐标相同!!它们都具有相同的dq/dx和dq/dy

请注意,它仍在z=0平面中。当将这种技术与透视相机投影结合使用时,可能会变得非常混乱,因为这会产生“错误的深度感知”。不过,它可能比只使用(s,t)要好。那由你决定


我想大多数想要在梯形上拟合矩形纹理的人都会想到以下两种结果之一:

  • 透视投影:从斜角度看,梯形看起来像一个矩形
  • “拉伸”变换:梯形看起来像一块被拉伸/收缩成形状的矩形橡胶
  • 这里的大多数解决方案都属于第一类,而我最近发现自己属于第二类

    我找到的实现效果2的最简单方法。将梯形分割成矩形和直角三角形。在我的例子中,梯形是规则的,所以一个四边形和两个三角形解决了这个问题。

    希望这能有所帮助: 引自该报: " 在每个像素处,使用(s=w;t=w;r=w;q=w)的插值执行除法,得到(s=q;t=q),其中 是最终纹理坐标。若要禁用此效果,则 可以直接在OpenGL中使用。”

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

    没有预见到vec4 v_TexCoord

    有一种解释:

    你能提供带有“错误”纹理截图的链接吗?我找到了解决问题的方法。查看链接文章,了解更多关于平面纹理的信息。你能更好地总结一下你是如何解决这个问题的吗?@Samuel先生,我建议查看链接文章“导航静态环境…”的第9页,该部分标题是“禁用透视校正”。更新“1和2拯救了我的一天,甚至是我的一周!”!一分钟加三次乘法,瞧!太棒了,我已经和它搏斗了好几天了。如果可能的话,我会把你选为总统!(见鬼,现在我甚至考虑把房子和汽车捐给你。)我要珍惜这一刻,我再也不会因为我的生活中的堆叠问题而欣喜若狂了。你所做的三角剖分只是一个分段仿射映射-三角形到三角形。啊,你说得对。我在没有考虑的情况下重复使用了一篇相关文章中的一个术语。我已经用正确的术语更新了我的答案。中间矩形的UV是什么?你能扩展到它吗?比如strq中的宽度是多少,所有顶点都需要strq格式吗?