Opengl 线性/非线性纹理映射扭曲的四边形

Opengl 线性/非线性纹理映射扭曲的四边形,opengl,textures,texture-mapping,Opengl,Textures,Texture Mapping,在我的示例中,我们确定,在对四边形进行纹理处理时,将面分解为三角形,并以仿射方式插值纹理坐标 不幸的是,我不知道如何解决这个问题。这个方法很有用,但没有达到预期的效果。作者总结道:“请注意,图像看起来就像是一个延伸到远处的长矩形四边形……它可能会变得非常混乱……因为这会产生“错误的深度感知” 我想做的是让纹理保持纹理的原始缩放。例如,在梯形情况下,我希望texel的垂直间距相同(使用paint program创建的示例): 请注意,由于垂直间距相同,但四边形明显扭曲,纹理空间中的直线不再是世界

在我的示例中,我们确定,在对四边形进行纹理处理时,将面分解为三角形,并以仿射方式插值纹理坐标

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

我想做的是让纹理保持纹理的原始缩放。例如,在梯形情况下,我希望texel的垂直间距相同(使用paint program创建的示例):

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

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


顺便说一句,我并不真正理解第三和第四纹理坐标;如果有人能给我指一个资源,那就太好了。

哇,这是一个相当复杂的问题。基本上,你并没有把透视法引入等式。最后的x,y坐标除以旋转时得到的z值。这意味着离相机越远,纹理空间(s,t)的变化越小

但是,通过这样做,可以有效地随着z的增加进行线性插值。我在1997年写了一篇文章。这称为“仿射”纹理贴图

因为你们要用x和y除以z,你们实际上需要用“1/z”来插值。这适当地考虑了应用的透视图(当您将x&y除以z时)。因此,你最终得到了

我希望我能说得更详细些,但在过去15多年的酗酒中,我的记忆有点模糊;)有一天,我很想再次访问软件渲染,因为我确信随着OpenCL的兴起,它将很快成为编写渲染引擎的更好方式

无论如何,希望这能给你一些帮助和道歉,我帮不了你了

(15年前,当我计算所有这些渲染时,我很想现在拥有所有可用的资源,互联网让我的工作和生活变得更加轻松。从第一原理开始计算一切都是非常痛苦的。我记得最初尝试过1/z插值,但随着距离越来越近,它使事情变得越来越小当我本应该把事情颠倒过来的时候就放弃了……直到今天,随着我的知识成倍地增长,我仍然真的希望我写了一个“缓慢”但完全正确的透视图渲染器……总有一天我会找到它;))


祝你好运

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

但是你最终会遇到一个类似于原始问题的问题,我试图解决它,一旦我有了它,就会发布一个解决方案