三维纹理坐标的透视校正

Jam*_*dge 11 opengl math 3d

我正在编写一个目前运行良好的软件渲染器,但我正在尝试对纹理坐标进行透视校正,这似乎不正确.我使用与我的渲染器的opengl相同的矩阵数学.要光栅化三角形,我执行以下操作:

  1. 使用模型视图和投影矩阵变换顶点,并转换为剪辑坐标.

  2. 对于每个三角形中的每个像素,计算重心坐标以插入属性(颜色,纹理坐标,法线等)

  3. 校正透视我使用透视校正插值:(w是顶点的深度坐标,c是顶点的纹理坐标,b是顶点的重心权重)

1/w = b0*(1/w0) + b1*(1/w1) + b2*(1/w2)
c/w = b0*(c0/w0) + b1*(c1/w1) + b2*(c2/w2)
c = (c/w)/(1/w)
Run Code Online (Sandbox Code Playgroud)

这应该纠正透视,它有点帮助,但仍然存在明显的透视问题.我在这里遗漏了一些东西,也许是一些舍入问题(我使用花车进行所有数学运算)?

在该图像中看到沿着对角线明显的纹理坐标中的误差,这是通过深度坐标进行划分的结果.

图像显示错误的透视校正

此外,这通常是针对纹理坐标进行的......是否还需要其他属性(例如法线等)?

Pau*_*l Z 1

是的,这看起来就像传统的破碎透视凹痕。不过你的算法看起来是正确的,所以我真的不确定可能出了什么问题。我会在稍后渲染时检查您是否确实使用了新计算的值?这看起来确实像是您费尽心思计算透视正确值,然后使用基本的未校正值进行渲染。