How does WebGL set values in the depth buffer?
在OpenGL中,深度缓冲值是根据场景的近和远裁剪平面计算的。 (参考:从深度缓冲区获取真实的z值)
这在WebGL中如何运作? 我的理解是WebGL不了解场景的远近裁剪平面。 近和远剪切平面用于计算我的投影矩阵,但是我从未告诉WebGL它们明确是什么,因此它无法使用它们来计算深度缓冲区值。
渲染场景时,WebGL如何在深度缓冲区中设置值?
WebGL(与现代OpenGL和OpenGL ES一样)从您提供给顶点着色器中
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中,程序员提供的着色器决定使用平截头体数学确定如何设置
本文介绍了使用WebGL / OpenGL渲染3d时最常用的设置
至于将什么实际值写入深度缓冲区,它是
1 2 | ndcZ = gl_Position.z / gl_Position.w; depthValue = (far - near) / 2 * ndcZ + (near - far) / 2 |
尽管可以使用
1 2 | ndcZ = gl_Position.z / gl_Position.w; depthValue = .5 * ndcZ - .5 |
然后,该depthValue将在0到1的范围内,并转换为深度缓冲区的任何位深度。通常有24位深度缓冲区
1 | bitValue = depthValue * (2^24 - 1) |