在 OpenGL 中,深度缓冲区值是根据场景的近和远裁剪平面计算的。(参考:从深度缓冲区获取真正的 z 值)
这在 WebGL 中是如何工作的?我的理解是 WebGL 不知道我的场景的远近剪裁平面。近和远裁剪平面用于计算我的投影矩阵,但我从未明确告诉 WebGL 它们是什么,因此它不能使用它们来计算深度缓冲区值。
渲染我的场景时,WebGL 如何在深度缓冲区中设置值?
在 OpenGL 中,深度缓冲区值是根据场景的近和远裁剪平面计算的。(参考:从深度缓冲区获取真正的 z 值)
这在 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 完全取决于程序员决定如何在第一名。
本文gl_Position.z
介绍了使用WebGL/OpenGL 渲染 3d 时最常用的数学设置。根据您的问题,尽管我建议您阅读前面链接的文章开头的文章。
至于将哪些实际值写入深度缓冲区
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)