gpt4 book ai didi

opengl - 在 OpenGL 中进行深度测试的 Z-fighting 解决方案 - 它们是如何工作的?

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

说明

我在 OpenGL 中遇到了 Z-Fighting 的主要问题,我花了很多时间来寻找这个问题的解决方案。我发现的一些我理解但不喜欢的:

  • 使多边形彼此远离(如 OpenGL 中的 glPolygonOffset )
  • 根据 Z 坐标划分场景并使用单独的干净 z 缓冲区绘制场景的各个部分。

  • 我不明白的那些:
  • 使用投影矩阵
    https://software.intel.com/en-us/articles/alternatives-to-using-z-bias-to-fix-z-fighting-issues
  • 使用“对数深度缓冲区”
    http://outerra.blogspot.com/2012/11/maximizing-depth-buffer-range-and.html

  • 我已经在我的程序中实现了第二个,只是将它放入一个球的顶点着色器中(它与地面进行了 z-fighting):
    float C = 1.0; 
    float far = 2000.0;
    gl_Position = u_projView * a_position;
    gl_Position.z = 2.0*log(gl_Position.w*C + 1.0)/log(far*C + 1.0) - 1.0;
    gl_Position.z *= gl_Position.w;

    它奏效了!

    实际问题
  • 谁能解释一下在顶点着色器中更改顶点的 Z 坐标是如何解决问题的,而不会对我明显地移动顶点? (场景在人眼看来是一样的)。它是如何改变 z 深度值的分布的?我猜我缺少一些关于渲染管道的知识。
  • 谁能向我解释我们如何使用 投影矩阵 解决问题?它是如何工作的?
  • 还有其他类似的有效方法可以解决 z-fighting 问题吗?

  • 谢谢!

    最佳答案

    也许深度缓冲精度有问题?使用 16 位缓冲区时,可能会发生 z-fighting。您可以使用以下方法检查它:

    glGetIntegerv( GL_DEPTH_BITS, &depthBits);

    关于opengl - 在 OpenGL 中进行深度测试的 Z-fighting 解决方案 - 它们是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24142068/

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