线性/非线性纹理映射失真的四边形

ima*_*ett 8 opengl textures texture-mapping

在我之前的问题中,已经确定,当对四边形进行纹理化时,将面分解为三角形并且以仿射方式内插纹理坐标.

不幸的是,我不知道如何解决这个问题.该提供的链接是有用的,但它并没有得到预期的效果.作者得出结论:"请注意,图像看起来好像是一个延伸到距离的长矩形四边形......它可能变得非常混乱......因为它会产生"虚假的深度感知".

我想做的是让纹理保留纹理的原始缩放.例如,在梯形情况下,我希望纹素的垂直间距相同(使用绘图程序创建的示例):

请注意,由于垂直间距相同,但四边形明显失真,纹理空间中的直线不再是世界空间中的直线.因此,我认为所需的映射是非线性的.

问题是:这在固定功能管道中是否可能?对于更普通的四边形,我甚至不确定"正确的答案"究竟是什么.我想插值函数可以非常快速地变得非常复杂,我意识到"保留原始缩放"并不是一个算法.世界空间三角形在纹理空间中不再是线性的.

顺便说一句,我并不真正了解3 和4 纹理坐标; 如果有人能指出我的资源,这将是伟大的.

Goz*_*Goz 2

哇,这是一个相当复杂的问题。基本上你没有将观点带入方程式中。最终的 x,y 坐标除以旋转时得到的 z 值。这意味着距离相机越远,纹理空间 (s,t) 的变化就越小。

然而,通过这样做,您可以有效地随着 z 的增加进行线性插值。我在 1997 年写了一个ANCIENT 演示,它做到了这一点。这称为“仿射”纹理映射。

事情是因为你将 x 和 y 除以 z,你实际上需要使用“1/z”来插值你的值。这正确地考虑了正在应用的透视(当您将 x 和 y 除以 z 时)。因此,您最终会得到“透视正确”的纹理映射

我希望我能讲得比这更详细,但在过去 15 多年的酗酒中,我的记忆变得有点模糊;)有一天,我很想重新访问软件渲染,因为我确信, OpenCL 之类的崛起很快就会成为编写渲染引擎的更好方法!

无论如何,希望这是一些帮助,抱歉我无法提供更多帮助。

(顺便说一句,当我 15 年前计算出所有这些渲染结果时,我很高兴现在拥有所有可用的资源,互联网使我的工作和生活变得更加轻松。从第一原则出发解决所有问题是非常痛苦的.我记得最初尝试过 1/z 插值,但随着它越来越近,它变得越来越小,当我应该反转事物时我放弃了它......直到今天,随着我的知识呈指数级增长,我仍然真的希望我写了一个“慢”但完全透视正确的渲染器......有一天我会抽出时间来处理它;))

祝你好运!