簡體   English   中英

OpenGL:渲染附加到FBO的顏色紋理會導致白色紋理

[英]OpenGL: Rendering to colour texture attached to FBO results in white texture

我的問題是,在設置了帶有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();

關於我在這里做錯什么的任何想法?

綁定FBO時,不得綁定FBO附加紋理。 紋理永遠不能同時是數據源和接收器。

對於已綁定紋理的所有紋理單元和目標,在將FBO綁定為渲染目標之前,必須綁定另一個紋理或不綁定任何紋理。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM