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
near 和 far 默认分别为 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)