在OpenGL中,深度缓冲区值是根据场景的近剪辑平面和远处的剪裁平面来计算的。(参考:从深度缓冲区获取真实的z值(
这在WebGL中如何起作用?我的理解是,WebGL并没有意识到我场景的远处和剪裁飞机。近距离剪裁平面用于计算我的投影矩阵,但我从不告诉WebGl它们是明确的,因此它不能使用它们来计算深度缓冲区值。
当我的场景渲染时,WebGL如何在深度缓冲区中设置值?
webgl(如Modern OpenGL和OpenGL ES(从您在顶点着色器中提供给gl_Position.z
的值的深度值(尽管您还可以使用某些扩展名但可以直接写入深度缓冲区,但是这不那么普遍(
WebGL或Modern OpenGL中没有场景。场景的概念是从90年代初期留下的旧版OpenGL的一部分,自从不推荐使用以来。它不存在于OpenGL ES(在Android,iOS,Chromeos,Raspberry Pi,WebGL等上运行的OpenGL ...(
现代OpenGL和WebGL只是栅格化API。您编写着在GPU上运行的小功能的着色器。您可以通过属性(按迭代数据(,统一(全局变量(,纹理(2D/3D数组(,不同(数据传递从顶点着色器到碎片着色器传递(。
其余的取决于您以及您提供的着色器功能。现代OpenGL和WebGL用于所有意图和目的,只是具有一定限制的通用计算引擎。要让他们做任何事情取决于您提供着色器。
有关更多信息,请参见WebGlfundamentals.org。
在Q& a链接到的Q&中,是程序员提供的着色器,决定使用Frustum Math来决定如何设置gl_Position.z
。Frustum数学由程序员提供。WebGL/GL不在乎如何计算gl_Position.z
,只是它是-1.0和 1.0之间的值第一名。
本文使用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
那个深度将在0到1范围内,并转换为深度缓冲区的任何深度。具有24位深度缓冲液是常见的
bitValue = depthValue * (2^24 - 1)