16

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);
4

1 に答える 1

0

これは、Intel HD グラフィックスの既知の問題である可能性があります。ここでこのプログラムをチェックしてください - http://www.realtech-vr.com/glview/download.php

このプログラムは、ビデオ カードがサポートしている OpenGL のバージョンを教えてくれます。Intel HD は 1.1 しかサポートしていない場合があります (奇妙なことに私は知っています!)。

幸運を!

于 2014-05-08T04:46:36.617 に答える