我一直在尝试渲染具有正方形纹理的GL_QUAD(形状为梯形)。我想尝试并仅使用OpenGL来实现这一点。现在,纹理变得严重变形,这确实很烦人。

通常,我将加载纹理以计算单应性,但这意味着大量工作和附加的线性编程库/直接线性变换函数。我印象中OpenGL可以为我简化此过程。

我在网上四处浏览,看到“透视-正确的纹理,Q坐标和GLSL” “ OpenGL中的倾斜/剪切纹理映射”

所有这些似乎都假设您将进行某种形式的单应性计算或使用某些我不知道的OpenGL的任何建议?

更新

我一直在阅读“使用图像导航静态环境-空间简化和变形” [ PDF ]-第9页附录A。

似乎他们通过将(s,t,r,q)纹理坐标与模型的世界空间z分量的顶点相乘来禁用透视校正。

因此对于给定的纹理坐标(s,r,t,q),形状为梯形的四边形,其中四个分量为: 通用标签

这和glTexCoord4f(s vert.z,r vert.z,t,q * vert.z)一样容易吗?还是我错过了一些步骤?像搞砸了GL_TEXTURE glMatrixMode吗?

更新#2:

成功了!提醒大家,这个问题遍及整个网络,没有简单的答案。大多数涉及直接用原始形状和变换形状之间的单应性重新计算纹理……又是很多线性代数和外部BLAS lib依赖性。

有帮助吗?

解决方案

在这里可以很好地说明问题和解决方案。

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。当纹理映射时,这会产生令人不愉快的图像。

即使我们通常不理会r= 0和q= 1defaults,纹理空间也不只是2D仿射平面。这确实是一个完整的投影空间(P3)!这很好,因为我们可以将它们指定为(s,t,r,q)坐标,而不是将上层顶点的纹理坐标指定为(0,1)和(1,1)的(s,t)坐标(0,width,0,width)和(width,width,0,width)中的一个!这些坐标对应于纹理图像中的相同位置,但是请看一下ds / dx发生了什么-现在两个三角形都相同了!它们都具有相同的dq / dx和dq / dy。

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

其他提示

我猜想大多数人都希望在梯形上适合矩形纹理,但他们会想到以下两个结果之一:

  1. 透视投影:从倾斜角度看,梯形看起来像一个矩形。
  2. “拉伸”转换:梯形看起来像一块矩形橡胶,已被拉伸/收缩成一定形状。

    SO上的大多数解决方案都属于第一类,而我最近发现自己属于第二类。

    我发现达到效果2的最简单方法是将梯形分为矩形和直角三角形。就我而言,梯形是规则的,所以一个四边形和两个三角形解决了这个问题。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top