Opengl 如何向深度缓冲区写入不同于用于深度比较的值?
在OpenGL中,是否可以在启用常规深度测试的情况下渲染多边形,但当深度缓冲区值实际写入深度缓冲区时,我想写入自定义值 (原因是我正在渲染一个粒子系统,它应该根据场景中的几何体进行深度测试,但我想在粒子系统所在的位置写入一个非常大的深度值,从而利用深度模糊后处理步骤进一步模糊粒子系统) 更新Opengl 如何向深度缓冲区写入不同于用于深度比较的值?,opengl,depth-buffer,depth-testing,Opengl,Depth Buffer,Depth Testing,在OpenGL中,是否可以在启用常规深度测试的情况下渲染多边形,但当深度缓冲区值实际写入深度缓冲区时,我想写入自定义值 (原因是我正在渲染一个粒子系统,它应该根据场景中的几何体进行深度测试,但我想在粒子系统所在的位置写入一个非常大的深度值,从而利用深度模糊后处理步骤进一步模糊粒子系统) 更新 要进一步细化问题,是否可以不在多个过程中渲染?您可以在片段着色器中使用gl_FragDepth来编写自定义值 gl_FragDepth = 0.3; 你没有 OpenGL不允许你撒谎。深度测试根据要写入深
要进一步细化问题,是否可以不在多个过程中渲染?您可以在片段着色器中使用gl_FragDepth来编写自定义值
gl_FragDepth = 0.3;
你没有
OpenGL不允许你撒谎。深度测试根据要写入深度缓冲区的传入值测试深度缓冲区中的值。一旦测试通过,测试的深度值将写入深度缓冲区。句号
除了测试深度值外,不能(ab)使用深度测试执行其他操作
确实允许您使用非常有限的形式。基本上,您向实现承诺,您将仅以使深度小于或大于原始值的方式更改深度。但即便如此,它也只能在特定的情况下起作用,而且只要你保持在你指定的限度之内
强制执行同样不允许您这样做。该规范明确规定,深度将在着色器执行之前写入。因此,您写入
gl_FragDepth
的任何内容都将被忽略。如果您写入gl_FragDepth,此值也将用于进行深度比较。这个问题明确要求修改深度测试,但不是深度测试本身。另外,除非两次渲染几何体,否则不可能使用不同的值进行测试和写入。如果问题是“是否可能”,那么答案是肯定的。在FBO中渲染场景,使用其深度纹理附件在片段着色器中执行“手动”深度测试(丢弃将无法通过深度测试的片段),并将任意深度值输出到另一个深度缓冲区(如果需要,可以通过FBO的blitting初始化)。所有这些的性能都没有保证…谢谢更新了这个问题。我从来没有使用过ARB_conservative_depth,但它可以解决你的问题。谢谢,基本上conservative depth会帮助我,但由于我是opengl es 3.0,我将不得不重新思考我的算法