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

时间:2012-05-31 19:25:33

标签: opengl textures texture-mapping

在我的previous question中,确定了在对四边形进行纹理处理时,将面部分解为三角形,并以仿射方式插入纹理坐标。

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

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

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

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

顺便说一句,我并不真正理解3 rd 和4 th 纹理坐标;如果有人能指出我的资源,那就太棒了。

2 个答案:

答案 0 :(得分:2)

使用现代gpu-api的解决方案的最佳方法可以在Nathan Reed的博客上找到

http://www.reedbeta.com/blog/2012/05/26/quadrilateral-interpolation-part-1/

但你最终遇到的问题类似于透视的原始问题:(我试着解决它,并且一旦我拥有它就会发布解决方案。

答案 1 :(得分:0)

哇,这是一个非常复杂的问题。基本上你并没有把观点带入等式中。您的最终x,y坐标除以旋转时得到的z值。这意味着您从相机获得的纹理空间(s,t)变化较小。

然而,通过这样做,有效地,随着z的增加线性插值。我在1997年写了一篇ANCIENT demo来做这件事。这被称为"仿射"纹理映射。

事情是因为你将x和y除以z,你实际上需要使用" 1 / z"来插值。这恰当地考虑了正在应用的视角(当你将x和y分开时)。因此,您最终得到"perspective correct" texture mapping

我希望我能够详细介绍,但在过去的15年多的酒精滥用中,我的记忆有点模糊;)其中一天我喜欢重新访问软件渲染,因为我和#39; m确信随着OpenCL的发展,它将很快成为编写渲染引擎的更好方式!

无论如何,希望有些帮助和道歉,我可以提供更多帮助。

(另外,当我想到15年前的所有渲染时,我现在喜欢拥有所有可用的资源,互联网让我的工作和生活变得更加轻松。第一原则是令人难以置信的痛苦。我记得最初尝试1 / z插值,但它变得越来越小,因为它越来越近我放弃它,当我应该倒置的东西......直到今天,因为我的知识已经成倍地增加,我仍然希望我写一个"慢"但完全透视正确的渲染器...有一天我会绕过它;)

祝你好运!