OpenGL のシーンを低解像度でフレーム バッファにレンダリングしています。次に、このバージョンを画面全体に描画します (GL_NEAREST で拡大)。これは、テクスチャ ブリッティング (glBlitFramebuffer) を使用して行います。Nvidia GPU ではこれは機能しますが、Intel i7 統合グラフィックスでまったく同じコードを実行すると、ターゲット フレームバッファの y 位置が正しくないように見えます (つまり、イメージが上にレンダリングされすぎます)。
glGetError はエラーを返しません。Nvidia ドライバーは非常に寛容な傾向があるため、Nvidia が気にしない OpenGL 仕様の小さな詳細が欠けていると思います。インターネットとスタックオーバーフローを検索しましたが、説明されている同様の問題が見つかりませんでした。どちらのドライバーも 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);