在OpenGL中,一个绘图调用中的一个着色器程序可以渲染到FBO和默认帧缓冲区吗?

时间:2015-05-04 07:42:59

标签: opengl shader fbo

我想将一个场景绘制到默认的帧缓冲区,同时还将一些与我绘制的模型相关的辅助数据绘制到具有与默认帧缓冲区相同的图像尺寸的屏幕外缓冲区。

我知道我可以分别做两个这样的事情,两个glDraw *调用(一个渲染到一个FBO,一个不渲染),它将使用两个合适的着色器程序。

我认为(还在了解这个)我可以通过将两个渲染缓冲区/纹理附加到一个FBO来同时执行 ,使用一个着色器程序执行一次glDraw *调用,其片段着色器将写入适当的值对应多个FBO附件的多个输出,最后将FBO中的两个图像之一复制到默认的帧缓冲区,使用它来构建场景填充四边形或调用glBlitFramebuffer。

但是我可以使用一个着色器程序进行一次glDraw *调用,并让我的片段着色器同时写入可见帧缓冲区和一些屏幕外FBO吗?我怀疑不是,我从相关文档中看到的,但我不确定。

1 个答案:

答案 0 :(得分:6)

不,你不能同时绘制到不同的帧缓冲区。但是你可以绘制到一个帧缓冲区的不同绘制缓冲区。这是可能的,并称为多个渲染目标

您需要以这种方式指定绘制缓冲区:

GLenum DrawBuffers[] =
{
    GL_COLOR_ATTACHMENT0,
    GL_COLOR_ATTACHMENT1,
    GL_COLOR_ATTACHMENT2,
    GL_COLOR_ATTACHMENT3 
};
glDrawBuffers(ARRAY_SIZE_IN_ELEMENTS(DrawBuffers), DrawBuffers);

然后,在片段着色器中,您必须编写如下内容:

layout (location = 0) out vec3 WorldPosOut;
layout (location = 1) out vec3 DiffuseOut;
layout (location = 2) out vec3 NormalOut;
layout (location = 3) out vec3 TexCoordOut;

uniform sampler2D gColorMap; 

void main()
{
    WorldPosOut = WorldPos0;
    DiffuseOut = texture(gColorMap, TexCoord0).xyz;
    NormalOut = normalize(Normal0);
    TexCoordOut = vec3(TexCoord0, 0.0);
} 

这将立即将值输出到所有绘制缓冲区。有关完整示例,请参阅http://ogldev.atspace.co.uk/www/tutorial35/tutorial35.html