gpt4 book ai didi

math - 3d 中纹理坐标的透视校正

转载 作者:行者123 更新时间:2023-12-04 02:17:48 28 4
gpt4 key购买 nike

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

  • 使用模型 View 和投影矩阵转换顶点,并转换为剪辑坐标。
  • 对于每个三角形中的每个像素,计算重心坐标以插入属性(颜色、纹理坐标、法线等)
  • 为了纠正透视,我使用透视正确插值:
    (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

    此外,这通常用于纹理坐标......其他属性(例如法线等)是否也需要?

    最佳答案

    我最近破解了这个问题的代码。如果您计划在将纹理分配给表面之前修改内存中的纹理,则可以使用单应性。这在计算上很昂贵,并且会为您的程序添加额外的依赖项。有一个很好的技巧可以为您解决问题。

    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

    关于math - 3d 中纹理坐标的透视校正,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5424078/

    28 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com