2015-05-04 15 views
5

我想绘制一个场景到默认帧缓冲区,同时也绘制一些与我绘制的模型相关的辅助数据到与默认帧缓冲区具有相同图像尺寸的离屏缓冲区。在OpenGL中,一个绘制调用中的一个着色器程序是否可以呈现给FBO和默认帧缓冲区?

我明白我可以分别做这两件事情,在两个glDraw *调用(一个渲染到一个FBO,一个没有),将使用两个适当的着色器程序。

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

但是,我可以让一个glDraw *调用一个着色器程序,并让我的片段着色器写入可见帧缓冲区和一些离屏FBO?根据我所看到的相关文件,我不怀疑,但我不确定。

回答

5

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

你需要指定绘图缓冲这样:

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

相关问题