我想要渲染到纹理工作,但我遇到了一些麻烦。我正在尝试在屏幕上渲染一个简单的四边形,以确保一切正常。
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);
}
答案 0 :(得分:3)
您的启用是使用glLoadIdentity
重置当前矩阵(最有可能是模型视图)。这就解释了为什么你的方块被移动到屏幕的角落。
您已将glPushAttrib
的通话注释掉,但没有注明与glPopAttrib
的匹配通话。如果你不在其他任何地方使用glPushAttrib
这应该设置一个错误标志并保持GL状态,但我不知道是这样的,并且它要求麻烦假设属性堆栈始终是空。
glBindFrameBuffer
的 This 文档表明您应该使用GL_FRAMEBUFFER
或GL_DRAW_FRAMEBUFFER
作为第一个参数:
target
必须是GL_DRAW_FRAMEBUFFER,GL_READ_FRAMEBUFFER或 GL_FRAMEBUFFER。如果绑定了framebuffer对象 GL_DRAW_FRAMEBUFFER或GL_READ_FRAMEBUFFER,它成为了目标 分别进行渲染或回读操作,直到删除或 另一个帧缓冲区绑定到相应的绑定点。调用 目标设置为GL_FRAMEBUFFER的glBindFramebuffer
绑定framebuffer
同时读取和绘制帧缓冲区目标。
代码中带有_EXT后缀的枚举可能与之前记录的版本之前的OpenGL版本有关。教程很容易让这样的细节过时。
检查您的环境&依赖与您的OpenGL版本相匹配的文档。如果由于某种原因您无法轻松确定您的OpenGL版本,请在致电glBindFrameBuffer
后检查GL_INVALID_ENUM错误。
答案 1 :(得分:2)
这段代码似乎错了:
//Attach the depth buffer
glFramebufferRenderbuffer(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, mFbo);
您在这里做的是尝试将mFbo作为渲染缓冲区附加到mFbo。但是,您已经正确连接了渲染缓冲区(这是在第一次调用glFramebufferRenderbuffer()时完成的)。我认为删除该代码应该可以解决您的问题。
答案 2 :(得分:1)
我怀疑,我的问题是在渲染FBO时正确设置glViewport和glOrtho。这段代码需要清理,但这是我修复它的方法。
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);
glViewport(0, 0, mWidth, mHeight);
// projection matrix
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
// orthographic projection
glOrtho(0, mWidth, 0, mHeight, -1, 1);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
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);
glViewport(0, 0, 1024, 768);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
// orthographic projection
glOrtho(0, 1024, 768, 0, -1, 1);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}