Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Opengl 如何向深度缓冲区写入不同于用于深度比较的值?_Opengl_Depth Buffer_Depth Testing - Fatal编程技术网

Opengl 如何向深度缓冲区写入不同于用于深度比较的值?

Opengl 如何向深度缓冲区写入不同于用于深度比较的值?,opengl,depth-buffer,depth-testing,Opengl,Depth Buffer,Depth Testing,在OpenGL中,是否可以在启用常规深度测试的情况下渲染多边形,但当深度缓冲区值实际写入深度缓冲区时,我想写入自定义值 (原因是我正在渲染一个粒子系统,它应该根据场景中的几何体进行深度测试,但我想在粒子系统所在的位置写入一个非常大的深度值,从而利用深度模糊后处理步骤进一步模糊粒子系统) 更新 要进一步细化问题,是否可以不在多个过程中渲染?您可以在片段着色器中使用gl_FragDepth来编写自定义值 gl_FragDepth = 0.3; 你没有 OpenGL不允许你撒谎。深度测试根据要写入深

在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,我将不得不重新思考我的算法