如果 OpenGL FBO 提供了具有
GL_COLOR_ATTACHMENT0
到 GL_COLOR_ATTACHMENT31
的多个颜色目标,但只有一个具有 GL_DEPTH_STENCIL_ATTACHMENT
的深度/模板目标,那么我如何能够存储多个颜色目标的深度信息?如果我将两个不同的场景渲染到同一 FBO 上不同颜色附件位置的两个不同颜色目标,我肯定需要两个不同的深度/模板目标来存储这两个颜色目标中每一个的深度信息,对吗?我将如何实现这一目标?我只是很困惑为什么只提供一个深度/模板目标,而同一个 FBO 上可以有多个颜色目标。
多种颜色附件并不意味着渲染不同的场景或视口。它们旨在存储来自同一渲染通道的多个输出,这意味着它们只需要一个深度缓冲区。
渲染多个场景或视口(除了额外的深度缓冲区之外)还需要不同的渲染通道,这也意味着单独运行深度测试、所有着色器、模板测试以及渲染管道中的其他所有内容。与渲染到不同的 FBO 相比,将场景渲染到同一 FBO 的不同颜色附件不会有任何优势。
相比之下,与渲染同一视口两次相比,允许来自同一渲染通道的多种颜色输出可显着提高性能,因为所有阶段(着色器、光栅化、深度测试)仅运行一次。多种颜色输出通常用于特殊效果,例如,用于输出法线或输出运动模糊的运动矢量。它们也在实现“延迟着色”管道时使用。