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

How does WebGL set values in the depth buffer?

在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。

在与之相关的Q&A中,程序员提供的着色器决定使用平截头体数学确定如何设置gl_Position.z。视锥数学由程序员提供。 WebGL / GL不在乎gl_Position.z的计算方式,只是它的值在-1.0到+1.0之间,因此如何从深度缓冲区获取值并返回Z完全取决于程序员决定如何计算首先。

本文介绍了使用WebGL / OpenGL渲染3d时最常用的设置gl_Position.z的数学方法。根据您的问题,尽管我建议您阅读前面的文章开头的文章。

至于将什么实际值写入深度缓冲区,它是

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

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

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

然后,该depthValue将在0到1的范围内,并转换为深度缓冲区的任何位深度。通常有24位深度缓冲区

1
bitValue = depthValue * (2^24 - 1)