我正在将 OpenGL 中的低分辨率场景渲染到帧缓冲区中。然后我打算把这个版本画到整个屏幕上(用 GL_NEAREST 放大)。我使用纹理 blitting (glBlitFramebuffer) 来做到这一点。在我的 Nvidia GPU 上这可以工作,但是在我的 Intel i7 集成显卡上执行完全相同的代码时,目标帧缓冲区上的 y-Position 似乎是错误的(即图像被渲染得太远了)。
glGetError 不返回错误。由于 Nvidia 驱动程序往往非常宽容,我希望我在 OpenGL 规范中遗漏了一个 Nvidia 不关心的小细节。我搜索了互联网和stackoverflow,找不到描述的类似问题。两个驱动程序都报告支持 OpenGL 3.0
我的绘图代码:
//setup viewport for small image
glPushAttrib(GL_VIEWPORT_BIT);
glViewport(0, 0, image.getWidth(), image.getHeight());
//bind small framebuffer
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, fbo);
glDrawBuffers(GL_COLOR_ATTACHMENT0);
glClear(GL_COLOR_BUFFER_BIT);
//draw
renderRotatedFull(1);//nothing interesting at all happening here
//reset Viewport
glPopAttrib();
//prepare and execute blitting
glBindFramebuffer(GL_READ_FRAMEBUFFER, fbo);
glReadBuffer(GL_COLOR_ATTACHMENT0);
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0);
glDrawBuffers(GL_BACK_LEFT);
glBlitFramebuffer(0, 0, image.getWidth(), image.getHeight(), 0, 0, Game.width,
Game.height, GL_COLOR_BUFFER_BIT, GL_NEAREST);
glBindFramebuffer(GL_FRAMEBUFFER, 0);
//throws exception if there is an OpenGL error
org.lwjgl.opengl.Util.checkGLError();
初始化如下:
fbo =glGenFramebuffers();
glBindFramebuffer(GL_FRAMEBUFFER, fbo);
rbo = glGenRenderbuffers();
glBindRenderbuffer(GL_RENDERBUFFER, rbo);
glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA8, image.getWidth(), image.getHeight());
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, rbo);
assert(glCheckFramebufferStatus(GL_FRAMEBUFFER) == GL_FRAMEBUFFER_COMPLETE);