Opengl 仅深度FBO和片段着色器之间的关系

Opengl 仅深度FBO和片段着色器之间的关系,opengl,shader,fragment-shader,fbo,depth-buffer,Opengl,Shader,Fragment Shader,Fbo,Depth Buffer,我一直在想,当为片段着色器部分绑定仅深度FBO(仅附加GL\u depth\u附件并调用glDrawBuffer(GL\u NONE)时会发生什么。因为任何颜色都会被丢弃: OpenGL是否只是以常规方式处理顶点,调用光栅化器,为光栅化片段应用片段着色器,但放弃任何结果 或者它会做更聪明的事情,比如处理顶点直到可选的几何体着色器,然后剪切片段着色器部分并使用虚拟片段着色器以丢弃无用的颜色计算 由于供应商的实现细节,我想可能会有所不同,但我想对这个主题有一个更好的了解。我读到(尽管从未亲自测试

我一直在想,当为片段着色器部分绑定仅深度FBO(仅附加
GL\u depth\u附件
并调用
glDrawBuffer(GL\u NONE)
时会发生什么。因为任何颜色都会被丢弃:

  • OpenGL是否只是以常规方式处理顶点,调用光栅化器,为光栅化片段应用片段着色器,但放弃任何结果
  • 或者它会做更聪明的事情,比如处理顶点直到可选的几何体着色器,然后剪切片段着色器部分并使用虚拟片段着色器以丢弃无用的颜色计算
由于供应商的实现细节,我想可能会有所不同,但我想对这个主题有一个更好的了解。

我读到(尽管从未亲自测试过)完全缺少颜色缓冲区会导致奇怪的未定义行为,因为OpenGL实现都必须反过来问这个问题:“在没有颜色缓冲区的情况下,我们应该/应该/怎么做?”并且没有正式的、在所有实现中普遍使用的答案

官方文件谨慎地避免提及这种情况


因此,建议您……不要这样做,而是始终使用颜色缓冲区,即使您不使用它。

根据我的经验,片段着色器即使没有输出也会运行。例如,可以使用“放弃”(discard)来使用穿透alpha纹理绘制阴影贴图

如果它确实有输出(或者更多的输出被绑定),那么它们应该被忽略。我可以想象,如果片段着色器不包含任何discard语句,智能驱动程序可以轻松地完全跳过片段着色器

还可以查看单独的着色器对象()。它允许您手动禁用阶段