8

在我之前的问题中,确定在对四边形进行纹理处理时,面部被分解为三角形,并且纹理坐标以仿射方式插值。

不幸的是,我不知道如何解决这个问题。提供的链接很有用,但没有达到预期的效果。作者总结道:“请注意,图像看起来好像是一个延伸到远处的长矩形四边形......它可能会变得相当混乱......因为这会产生“错误的深度感知”。”

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

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

问题是:这在固定功能管道中是否可能?我什至不确定更一般的四边形的“正确答案”是什么。我想插值函数会很快变得非常复杂,我意识到“保留原始缩放”并不完全是一种算法。世界空间三角形在纹理空间中不再是线性的。

顺便说一句,我不太了解第 3第 4纹理坐标;如果有人可以将我指向一个资源,那就太好了。

4

2 回答 2

2

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

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

但是您最终会遇到与透视图的原始问题类似的问题:(我尝试解决它,并在获得解决方案后发布解决方案。

于 2013-02-05T10:26:44.707 回答
1

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

但是,通过这样做,您可以有效地随着 z 的增加进行线性插值。我在 1997 年写了一个ANCIENT 演示,这就是所谓的“仿射”纹理映射。

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

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

无论如何,希望那是一些帮助和道歉,我不能提供更多帮助。

(顺便说一句,当我在 15 年前弄清楚所有这些渲染时,我很想拥有现在可用的所有资源,互联网使我的工作和生活变得如此轻松。从第一原则解决所有问题非常痛苦. 我记得最初尝试过 1/z 插值,但随着它越来越近,它变得越来越小,当我应该颠倒一些东西时我放弃了它......直到今天,随着我的知识成倍增加,我仍然非常希望我写了一个“慢”但完全正确的渲染器......有一天我会解决它;))

祝你好运!

于 2012-05-31T20:56:21.480 回答