我正在使用 OpenTK、opengl ES 2.0,并且希望将深度缓冲区清除为每次重绘时从外部加载的缓冲区。
我想要实现的是在相机和背景对象不移动的情况下将屏幕清除为预渲染图像及其深度缓冲区,然后仅以传统方式在此之上渲染移动对象。
如何以高效的方式做到这一点?
gl_FragCoord
是不可变的,GLES SL 不提供gl_FragDepth
. 所以没有办法在片段着色器中设置片段的输出深度。
结果出现了两个选项:
要执行前者,您需要将深度纹理绑定到备用单元,然后在片段着色器中进行显式比较并丢弃,基于gl_FragCoord
.
要执行后者,您需要提交一个点数组,每个片段一个,在顶点着色器中对深度纹理进行采样并适当地输出深度。如果您的硬件不支持顶点着色器中的纹理采样,那么您可以在 CPU 上执行相同的操作。将 CPU 计算的片段留在 VBO 中,您最终不应该支付那么多的逐帧费用。