设置OpenGL多个渲染目标

时间:2011-08-26 15:55:25

标签: opengl framebuffer

我已经看过很多关于这个主题的材料,但是我发现的例子之间存在一些差异,而且我很难深入了解正确的过程。希望有人可以告诉我,我是否走在正确的轨道上。我还应该提到我在OS X Snow Leopard和最新版本的Xcode 3上做这个。

为了举例,我想说我要写两个目标,一个用于普通,一个用于颜色。为此,我创建了一个帧缓冲区并将两个纹理绑定到它,以及深度纹理:

glGenFramebuffersEXT(1, &mFBO);
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, mFBO);

glGenTextures(1, &mTexColor);
glBindTexture(GL_TEXTURE_2D, mTexColor);
//<texture params>
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, w, h, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, mTexColor, 0);

glGenTextures(1, &mTexNormal);
glBindTexture(GL_TEXTURE_2D, mTexNormal);
//<Texture params>
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, w, h, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT1_EXT, GL_TEXTURE_2D, mTexNormal, 0);

glGenTextures(1, &mTexDepth);
glBindTexture(GL_TEXTURE_2D, mTexDepth);
glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT24, w, h, 0, GL_DEPTH_COMPONENT, GL_UNSIGNED_BYTE, NULL);
glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_TEXTURE_2D, mTexDepth, 0);

glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0)

在渲染之前,我会再次绑定帧缓冲,然后执行:

GLenum buffers[] = { GL_COLOR_ATTACHMENT0_EXT, GL_COLOR_ATTACHMENT1_EXT };
glDrawBuffers(2, buffers);

这意味着进一步的绘制调用会吸引到我的帧缓冲区。 (我想?)

然后我会设置着色器并绘制场景。在我的顶点着色器中,我会像往常一样处理法线/位置/颜色,并将数据传递给片段着色器。然后该片段将执行以下操作:

gl_FragData[0] = OutputColor;
gl_FragData[1] = OutputNormal;

此时,我应该有两个纹理;一个具有来自所有渲染对象的颜色,一个具有法线。这一切都正确吗?我现在应该可以像其他任何一样使用这些纹理,比如将它们渲染成全屏四边形,对吗?

1 个答案:

答案 0 :(得分:10)

听起来很合理。这确实是做到这一点的常用方法。如果您不需要深度数据作为纹理以进行进一步处理,您还可以使用渲染缓冲区作为附件,但纹理也可以正常工作。

在完成所有设置后,您还可以使用glCheckFramebufferStatusEXT,以查看帧缓冲区在其当前配置中是否有效,但您的代码看起来很好。如果你没有问题,这只是为了保证,那么请放心,你是在正确的轨道,否则告诉我们什么是错的。