【问题标题】:Relation between depth-only FBO and fragment shader仅深度 FBO 和片段着色器之间的关系
【发布时间】:2015-04-10 21:57:05
【问题描述】:

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

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

由于 vendor-implementation 细节,我想可能会有所不同,但我想对该主题有更好的了解。

【问题讨论】:

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


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

      我读过(虽然从未亲自测试过)完全缺乏颜色缓冲区会导致奇怪的未定义行为,因为每个 OpenGL 实现都必须反过来问这个问题:“当没有颜色缓冲?”并且没有官方的、通用的跨所有实现的答案。

      官方文档小心翼翼地避免提及这种情况。

      因此,仅建议您简单地...不要这样做,而是始终拥有一个颜色缓冲区,即使您不使用它也是如此。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多