WebGL 如何在深度缓冲区中设置值?

How does WebGL set values in the depth buffer?

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

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

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

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

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

bitValue = depthValue * (2^24 - 1)