【问题标题】:How does WebGL set values in the depth buffer?WebGL 如何在深度缓冲区中设置值?
【发布时间】:2017-09-19 17:27:42
【问题描述】:

在 OpenGL 中,深度缓冲区值是根据场景的近裁剪平面和远裁剪平面计算的。 (参考:Getting the true z value from the depth buffer

这在 WebGL 中是如何工作的?我的理解是 WebGL 不知道我的场景的远近剪裁平面。近和远裁剪平面用于计算我的投影矩阵,但我从未明确告诉 WebGL 它们是什么,因此它不能使用它们来计算深度缓冲区值。

渲染我的场景时,WebGL 如何在深度缓冲区中设置值?

【问题讨论】:

    标签: webgl depth-buffer depth-testing


    【解决方案1】:

    WebGL(如现代 OpenGL 和 OpenGL ES)从您在顶点着色器中提供给 gl_Position.z 的值中获取深度值(尽管您也可以使用某些扩展直接写入深度缓冲区,但这并不常见)

    WebGL 和现代 OpenGL 中都没有 场景。场景的概念是 90 年代早期遗留下来的遗留 OpenGL 的一部分,并且早已被弃用。它不存在于 OpenGL ES(在 Android、iOS、ChromeOS、Raspberry PI、WebGL 等上运行的 OpenGL)

    现代 OpenGL 和 WebGL 只是光栅化 API。你编写着色器,它们是在 GPU 上运行的小函数。您通过属性(每次迭代数据)、制服(全局变量)、纹理(2d/3d 数组)、变量(从顶点着色器传递到片段着色器的数据)为这些着色器提供数据。

    其余的取决于您以及您提供的着色器函数的作用。现代 OpenGL 和 WebGL 出于所有意图和目的,只是具有一定限制的通用计算引擎。让他们做任何事情都取决于您提供着色器。

    请参阅webglfundamentals.org 了解更多信息。

    在您链接到的问答中,程序员提供的着色器决定使用平截头体数学来决定如何设置gl_Position.z。平截头体数学由程序员提供。 WebGL/GL 不关心 gl_Position.z 是如何计算的,只是它是一个介于 -1.0 和 +1.0 之间的值,因此如何从深度缓冲区中获取一个值并返回 Z 完全取决于程序员决定如何计算首先是它。

    This article 涵盖了使用 WebGL/OpenGL 渲染 3d 时设置gl_Position.z 的最常用数学。根据您的问题,我建议您阅读前面链接的文章开头的文章。

    至于将哪些实际值写入深度缓冲区

    ndcZ = gl_Position.z / gl_Position.w;
    depthValue = (far - near) / 2 * ndcZ + (near - far) / 2
    

    nearfar 默认分别为 0 和 1,尽管您可以使用 gl.depthRange 设置它们,但假设它们是 0 和 1 则

    ndcZ = gl_Position.z / gl_Position.w;
    depthValue = .5 * ndcZ - .5
    

    该 depthValue 然后将在 0 到 1 的范围内,并转换为深度缓冲区的任何位深度。有一个 24 位深度的缓冲区是很常见的,所以

    bitValue = depthValue * (2^24 - 1)
    

    【讨论】:

    • "depthValue = .5 * ndcZ - .5"
    猜你喜欢
    • 2011-11-11
    • 1970-01-01
    • 2018-06-05
    • 1970-01-01
    • 1970-01-01
    • 2012-04-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多