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

时间:2015-04-10 21:57:06

标签: opengl shader fragment-shader fbo depth-buffer

我一直想知道在片段着色器部分绑定仅深度FBO(仅GL_DEPTH_ATTACHMENT附加且glDrawBuffer(GL_NONE)被调用)时会发生什么。因为任何颜色都被丢弃了:

  • OpenGL是否只是以常规方式处理顶点,调用光栅化器,对光栅化片段应用片段着色器,但丢弃任何结果
  • 还是做了更聪明的事情,比如处理顶点直到可选的几何着色器,然后剪切片段着色器部分并使用虚拟片段着色器以丢弃无用的颜色计算?

由于供应商实施的详细信息,我想它可能会有所不同,但我想对该主题有更好的了解。

2 个答案:

答案 0 :(得分:1)

根据我的经验,片段着色器即使没有输出也仍会运行。例如,这可以用于使用丢弃来绘制具有穿透式alpha纹理的阴影贴图。

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

也许可以查看单独的着色器对象(https://www.opengl.org/registry/specs/ARB/separate_shader_objects.txt)。它允许您手动禁用阶段。

答案 1 :(得分:0)

我已经读过(虽然从未亲自测试过)完全没有颜色缓冲区导致奇怪的未定义行为,因为OpenGL实现每个人都不得不反过来问这个问题:“什么/应该/我们让它做什么时候没有颜色缓冲?“并且没有官方的,常用的跨所有实现答案。

官方文件小心避免一般性地提及这种情况。

因此,建议你只是......不要这样做,而是总是有一个颜色缓冲区,即使你不使用它。