Math 三维纹理坐标的透视校正

Math 三维纹理坐标的透视校正,math,opengl,3d,Math,Opengl,3d,我正在编写一个软件渲染器,目前运行良好,但我正在尝试对纹理坐标进行透视校正,但这似乎不正确。我在渲染器中使用了与opengl相同的矩阵数学。要栅格化三角形,请执行以下操作: 使用modelview和投影矩阵变换顶点,并变换为剪辑坐标 对于每个三角形中的每个像素,计算重心坐标以插值属性(颜色、纹理坐标、法线等) 要校正透视,我使用透视校正插值: (w是顶点的深度坐标,c是顶点的纹理坐标,b是顶点的重心权重) 这对于透视图来说应该是正确的,并且有一点帮助,但是透视图仍然存在一个明显的问题。我是否遗漏

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

  • 使用modelview和投影矩阵变换顶点,并变换为剪辑坐标

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

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

  • 这对于透视图来说应该是正确的,并且有一点帮助,但是透视图仍然存在一个明显的问题。我是否遗漏了一些东西,可能是一些舍入问题(我在所有数学中都使用浮点数)

    在这张图像中,纹理坐标沿对角线方向的误差很明显,这是按深度坐标进行分割的结果


    另外,这通常是针对纹理坐标完成的。。。其他属性(如法线等)也需要它吗?

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

    您需要通知OpenGL您需要对具有

    glHint(GL_PERSPECTIVE_CORRECTION_HINT,GL_NICEST)
    

    您所观察到的是线性纹理贴图的典型失真。在不能进行每像素透视校正的硬件上(例如PS1),标准解决方案只是细分为较小的多边形,以使缺陷不那么明显。

    从UV坐标到3D平面的唯一正确变换是单应变换

    你必须在你计算的某个时候得到它

    要自己找到它,可以编写纹理任何像素的投影(与顶点的投影相同),然后将它们反转,以从屏幕坐标获得纹理坐标。
    它将以同形变换的形式出现

    我最近破解了这个问题的代码。如果计划在将纹理指定给曲面之前修改内存中的纹理,则可以使用单应。这在计算上很昂贵,并且会给程序增加额外的依赖性。有一个很好的黑客可以帮你解决这个问题

    OpenGL会自动将透视校正应用于正在渲染的纹理。您只需将纹理坐标(UV-0.0f-1.0f)乘以平面每个角点的Z分量(XYZ位置向量的世界空间深度),即可“摆脱”OpenGL的透视校正

    我最近提出并解决了这个问题。请尝试一下此链接:

    我读到的那篇报道称,修复了这个问题

    希望这有帮助


    ct

    屏幕截图可能会有所帮助。在我获得10分之前,我无法添加屏幕截图:(仅看数字,校正和未校正的tex坐标之间的差值为1.0e-4(tex坐标在[0.0,1.0]范围内)。可能存在缩放问题?我使用剪辑深度坐标进行缩放对吗?这是一个软件渲染器,不是opengl(想想一个mod添加了该标记)…但我使用opengl数学进行所有转换。对不起…我看到了标记opengl,所以假设您使用的是opengl(如果硬件无法提供功能,则应切换到软件渲染)。无论如何,您所观察到的是所谓的“线性透视投影”问题,当您为顶点计算正确的UV值时,会发生这种情况,但在渲染多边形时,多边形填充器会对其进行线性插值。
    glHint(GL_PERSPECTIVE_CORRECTION_HINT,GL_NICEST)