【问题标题】:perspective correction of texture coordinates in 3d3D纹理坐标的透视校正
【发布时间】:2011-03-24 18:56:17
【问题描述】:

我正在编写一个当前运行良好的软件渲染器,但我正在尝试对纹理坐标进行透视校正,但这似乎不正确。我在渲染器中使用与 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)

这应该可以纠正透视,并且有点帮助,但仍然存在明显的透视问题。我在这里遗漏了什么,也许是一些舍入问题(我对所有数学都使用浮点数)?

在这张图片中可以看到纹理坐标沿对角线的明显误差,这是除以深度坐标的结果。

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

【问题讨论】:

  • 截图可能会有帮助。
  • 在我的评分为 10 之前,我无法添加屏幕截图 :(

标签: math opengl 3d


【解决方案1】:

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

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】:

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

    glHint(GL_PERSPECTIVE_CORRECTION_HINT,GL_NICEST)
    

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

    【讨论】:

    • 这是一个软件渲染器,而不是 opengl(认为一个 mod 添加了那个标签)......但我正在使用 opengl 数学进行所有转换。
    • 抱歉...我看到了 OpenGL 标签,因此假设您使用的是 OpenGL(如果硬件无法提供功能,则应该切换到软件渲染)。无论如何,您所观察到的是所谓的“线性透视投影”问题,当您计算顶点的正确 UV 值但 polyfiller 在渲染多边形时线性插值它们时会发生。
    【解决方案3】:

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

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

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

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

      • 只看数字,校正和未校正的tex坐标之间的差异大约为1.0e-4(tex坐标在[0.0,1.0]范围内)。也许存在缩放问题?我是否正确使用剪辑深度坐标进行缩放?
      猜你喜欢
      • 2012-05-27
      • 1970-01-01
      • 1970-01-01
      • 2011-07-26
      • 1970-01-01
      • 2020-06-10
      • 1970-01-01
      • 2015-06-29
      相关资源
      最近更新 更多