rjk*_*lan 3 depth-buffer webgl depth-testing
在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完全取决于程序员如何决定在第一名.
本文介绍了使用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)
| 归档时间: |
|
| 查看次数: |
2546 次 |
| 最近记录: |