项目的程序里设计需要将某一帧渲染出来的画面拆成三通道单色图像存到三张纹理里面。要绘制到纹理里,自然就想到FBO了。但是一次要输出多张纹理,这个还没接触过。一阵网上搜索过后,终于了解到了MRT(多重渲染目标)。但是网上的教程大部分都使用到了Fragment Shader里的一个预置变量:gl_FragData[]。但是实际使用当中,glsl却报告说这个gl_FragData变量是不建议使用了。于是再经过多方搜索,知道了建议的操作方法是如何实现的。
首先自然是新建一个FBO,然后绑定缓存。一般的FBO我们会绑定一个颜色缓存和一个深度缓存。如果是渲染到纹理,我们就会把一个同样尺寸的纹理绑到颜色缓存中去,比如以下代码:
//新建FBO
GLuint fboId;
glGenFramebuffersEXT(1, &fboId);
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fboId);
//绑定纹理
glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT,
GL_TEXTURE_2D, textureId, 0);
//绑定深度缓存
glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT,
GL_RENDERBUFFER_EXT, rboId);
当然深度缓存也是要预先建好的。那么现在我需要绑定三个纹理,该如何绑定呢?
FBO是提供了不止一个颜色挂接点的。因此,我们可以将第i张纹理绑定到第i个颜色挂接点上。具体一个FBO能有多少个颜色挂接点,可以