首页 文章

三维纹理坐标的透视校正

提问于
浏览
11

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

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

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

  • 校正透视我使用透视正确插值:(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)

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

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

image showing incorrect perspective correction

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

4 回答

  • 2

    您需要告知OpenGL您需要对像素进行透视校正

    glHint(GL_PERSPECTIVE_CORRECTION_HINT,GL_NICEST)
    

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

  • 2

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

    http://en.wikipedia.org/wiki/Homography

    您必须在计算中的某个时刻拥有它 .

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

  • 1

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

    OpenGL会自动将透视校正应用于渲染的纹理 . 您需要做的就是将纹理坐标(UV - 0.0f-1.0f)乘以平面每个角的Z分量(XYZ位置矢量的世界空间深度),它将“抛弃”OpenGL的透视校正 .

    我最近问了并解决了这个问题 . 给这个链接一个镜头:

    texture mapping a trapezoid with a square texture in OpenGL

    我读过的那篇论文修正了这个问题,"Navigating Static Environments Using Image-Space Simplification and Morphing" - page 9 appendix A.

    希望这可以帮助!

    CT

  • 2

    是的,这看起来像你传统的破碎透视凹痕 . 你的算法看起来很正确,所以我真的不确定会出现什么问题 . 我会在你渲染它时检查你实际上是否正在使用新计算的值?这看起来好像你去了计算透视校正值的麻烦,然后使用基本的非校正值进行渲染 .

相关问题