1

我的问题是,在设置了一个帧缓冲区对象后,它具有附加到 GL_COLOR_ATTACHMENT0 点的单一颜色纹理,并在我将其绘制到屏幕上时将许多对象渲染到该纹理上,我得到了一个完全白色的纹理。

现在我知道绘图代码是正确的,因为我可以很好地绘制到后台缓冲区,只是当涉及到帧缓冲区时才会出现问题。绘图代码使用了一个非常基本的着色器,用于对四边形进行纹理处理。

我的代码如下:

// Create the FBO
glGenFramebuffers(1, &m_gbufferFBO);
glBindFramebuffer(GL_FRAMEBUFFER, m_gbufferFBO);

// Create a colour texture for use in the fbo
glGenTextures(1, &m_colourBuffer);
glBindTexture(GL_TEXTURE_2D, m_colourBuffer);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, m_width, m_height, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, m_colourBuffer, 0);

// check if the frame buffer was successfully created
CheckFrameBufferErrors();
CheckGLErrors();


// Begin rendering with the frame buffer
glBindFramebuffer(GL_FRAMEBUFFER, m_gbufferFBO);
glPushAttrib(GL_VIEWPORT_BIT | GL_COLOR_BUFFER_BIT);

// Set the viewport to match the width and height of our FBO
glViewport(0, 0, m_width, m_height);

glDrawBuffer(GL_COLOR_ATTACHMENT0);

// Clear buffer to whatever the clear colour is set to
glClearColor(m_clearColour.GetR(), m_clearColour.GetG(), m_clearColour.GetB(), m_clearColour.GetA());
glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT );

Game::GetInstance().GetCamera()->ApplyViewTransform();


// RENDERING OF OBJECTS


glPopAttrib();
glBindFramebuffer(GL_FRAMEBUFFER, 0);

然后使用固定函数管道将缓冲区的颜色纹理渲染到屏幕上。

glDisable(GL_DEPTH_TEST);
glDisable(GL_BLEND);

glActiveTexture(GL_TEXTURE0);
glEnable(GL_TEXTURE_2D);

// Render the colour buffer to screen
glBindTexture(GL_TEXTURE_2D, m_colourBuffer);

glMatrixMode(GL_MODELVIEW); 
glLoadIdentity();

glBegin(GL_QUADS);

glTexCoord2f(0.f, 0.f); glVertex3f(0.f, 0.f, 0.f);
glTexCoord2f(1.f, 0.f); glVertex3f(m_width, 0.f, 0.f);
glTexCoord2f(1.f, 1.f); glVertex3f(m_width, m_height, 0.f);
glTexCoord2f(0.f, 1.f); glVertex3f(0.f, m_height, 0.f);

glEnd();

关于我在这里可能做错的任何想法?

4

1 回答 1

7

绑定 FBO 时,不得绑定 FBO 附加纹理。纹理永远不能同时作为数据源和接收器。

对于已绑定纹理的所有纹理单元和目标,您必须在将 FBO 绑定为渲染目标之前绑定另一个纹理或不绑定纹理。

于 2011-12-04T15:29:32.050 回答