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

rjk*_*lan 3 depth-buffer webgl depth-testing

在OpenGL中,深度缓冲值是基于场景的近剪裁平面和远剪裁平面计算的.(参考:从深度缓冲区获取真实的z值)

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

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

gma*_*man 9

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完全取决于程序员如何决定在第一名.

本文介绍了使用gl_Position.zWebGL/OpenGL渲染3d时最常用的数学设置.根据你的问题,虽然我建议阅读在那篇文章开头链接的前面的文章.

至于什么实际值被写入深度缓冲区呢

ndcZ = gl_Position.z / gl_Position.w;
depthValue = (far - near) / 2 * ndcZ + (near - far) / 2
Run Code Online (Sandbox Code Playgroud)

near并且far默认分别为0和1虽然您可以设置它们gl.depthRange但假设它们是0和1然后

ndcZ = gl_Position.z / gl_Position.w;
depthValue = .5 * ndcZ - .5
Run Code Online (Sandbox Code Playgroud)

然后,该depthValue将在0到1范围内并转换为深度缓冲区的任何位深度.这样有一个24位深度缓冲区是很常见的

bitValue = depthValue * (2^24 - 1)
Run Code Online (Sandbox Code Playgroud)