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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.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_Glsl_Fragment Shader_Raytracing - Fatal编程技术网

Opengl 片段着色器是否仅对可见片段运行?

Opengl 片段着色器是否仅对可见片段运行?,opengl,glsl,fragment-shader,raytracing,Opengl,Glsl,Fragment Shader,Raytracing,我们需要在OpenGL中编写光线跟踪器。现在,我决定为每个片段着色器调用拍摄一条光线,因为据我所知,片段是可以由几何体对象写入的屏幕像素。所以我想知道片段着色器是只对可见像素运行还是对所有像素运行。如果它只对可见光线运行,则假定主光线(从屏幕到对象)不受阻挡。这将节省大量计算。绝对不能保证片段着色器的执行意味着片段确实可见 早期的深度测试本身并不能拯救你。前后渲染每个三角形不会节省您的时间;在OpenGL中,无法保证片段是按顺序生成的(仅“好像”按顺序生成)。这就忽略了重叠的情况,在这种情况下,

我们需要在OpenGL中编写光线跟踪器。现在,我决定为每个片段着色器调用拍摄一条光线,因为据我所知,片段是可以由几何体对象写入的屏幕像素。所以我想知道片段着色器是只对可见像素运行还是对所有像素运行。如果它只对可见光线运行,则假定主光线(从屏幕到对象)不受阻挡。这将节省大量计算。

绝对不能保证片段着色器的执行意味着片段确实可见

早期的深度测试本身并不能拯救你。前后渲染每个三角形不会节省您的时间;在OpenGL中,无法保证片段是按顺序生成的(仅“好像”按顺序生成)。这就忽略了重叠的情况,在这种情况下,不可能有一个正确的顺序。就OpenGL而言,即使在单独的渲染命令中发出每个三角形,也不能保证任何东西

确保这一点的唯一方法是执行深度预传递。也就是说,渲染整个场景,但不激活片段着色器(并关闭对帧缓冲区的颜色写入)。这将把所有深度数据写入深度缓冲区。这样,如果使用早期深度测试,当再次渲染场景时,通过深度测试的片段将是可见的片段


深度预处理可以非常快,这取决于顶点着色器和渲染管道的其他方面。

我认为这取决于启用的深度测试。