我正在渲染渲染紋理工作,但我有點麻煩。我正嘗試在屏幕上渲染一個簡單的四邊形以確保一切正常。渲染紋理問題
target->enable();
glBegin(GL_QUADS);
glColor4f(1.f, 0.f, 0.f, 1.f);
glVertex3f(0.f, 0.f, 0.f);
glColor4f(0.f, 1.f, 0.f, 1.f);
glVertex3f(16.f, 0.f, 0.f);
glColor4f(0.f, 0.f, 1.f, 1.f);
glVertex3f(0.f, 16.f, 0.f);
glColor4f(1.f, 1.f, 0.f, 1.f);
glVertex3f(16.f, 16.f, 0.f);
glEnd();
target->disable();
當我畫了四到屏幕正常,四呈現預期。但是,當我繪製渲染目標的四邊形時,四邊形會在屏幕的左下角呈現,並且不會呈現給目標。
RenderTarget::RenderTarget(GraphicsDevice *graphics, GLuint width, GLuint height) {
mWidth = width;
mHeight = height;
// First create the depth buffer
glGenRenderbuffers(1, &mDepth);
glBindRenderbuffer(GL_RENDERBUFFER_EXT, mDepth);
// Tell OpenGL that this renderbuffer is going to be a depth buffer
glRenderbufferStorage(GL_RENDERBUFFER_EXT, GL_DEPTH_COMPONENT, mWidth, mHeight);
glFramebufferRenderbuffer(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, mDepth);
glBindRenderbuffer(GL_RENDERBUFFER_EXT, 0);
// Create the frame buffer texture
glGenTextures(1, &mTexture);
glBindTexture(GL_TEXTURE_2D, mTexture);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, mWidth, mHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
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_MAG_FILTER, GL_LINEAR);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glBindTexture(GL_TEXTURE_2D, 0);
// Create the frame buffer
glGenFramebuffers(1, &mFbo);
glBindFramebuffer(GL_FRAMEBUFFER_EXT, mFbo);
// Attach the texture
glFramebufferTexture2D(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, mTexture, 0);
//Attach the depth buffer
glFramebufferRenderbuffer(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, mFbo);
glBindFramebuffer(GL_FRAMEBUFFER_EXT, 0);
}
RenderTarget::~RenderTarget() {
glDeleteBuffers(1, &mFbo);
glDeleteBuffers(1, &mDepth);
glDeleteTextures(1, &mTexture);
mFbo = 0;
mDepth = 0;
mTexture = 0;
}
void RenderTarget::enable() {
// Bind the frame buffer
glBindFramebuffer(GL_FRAMEBUFFER_EXT, mFbo);
// store the glViewport and glEnable states
//glPushAttrib(GL_VIEWPORT_BIT | GL_ENABLE_BIT);
glClearColor(1.f, 0.f, 0.f, 1.f);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glClearColor(0.f, 0.f, 0.f, 0.f);
glLoadIdentity();
}
void RenderTarget::disable() {
// Restore glViewport and glEnable states
glPopAttrib();
glBindFramebuffer(GL_FRAMEBUFFER_EXT, 0);
}
你的FBO [完整](http://www.opengl.org/wiki/Framebuffer_Object#Framebuffer_Completeness)?你似乎沒有調用'glCheckFramebufferStatus()'。 – genpfault 2012-01-04 21:28:43
是的,回來了GL_FRAMEBUFFER_COMPLETE_EXT。 – rcapote 2012-01-04 21:59:33