我正在编写一个软件渲染器,目前已经工作良好,但我正在尝试获得纹理坐标的透视校正,但似乎不正确。我在我的渲染器中使用了与OpenGL相同的矩阵数学。为了光栅化三角形,我执行以下操作:
1. 使用模型视图和投影矩阵转换顶点,并转换为剪辑坐标。 2. 对于每个三角形中的每个像素,计算重心坐标以插值属性(颜色、纹理坐标、法线等)。 3. 为了进行透视校正插值,我使用透视校正插值公式: (w是顶点的深度坐标,c是顶点的纹理坐标,b是顶点的重心权重)
请查看此图像中沿对角线明显的纹理坐标错误,这是通过深度坐标进行除法运算的结果。
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)
这应该可以纠正透视,有一定帮助,但仍然存在明显的透视问题。我是否遗漏了某些内容,可能是四舍五入问题(我在所有数学计算中都使用浮点数)?请查看此图像中沿对角线明显的纹理坐标错误,这是通过深度坐标进行除法运算的结果。
另外,这通常用于纹理坐标...其他属性(如法线等)也需要吗?