Mac環境のOpenGLでハマったので、備忘録として書きます。
MacのOpenGL Core Profile環境で、昔(2007年頃)自作してたFrame Buffer Objectのヘルパライブラリを
引っ張りだして、FBO使ったんですよ。FBO。
そのライブラリ使って、FBOにポリゴン描画したんです。
で、FBOにアタッチしてたテクスチャを、画面をピッタリ覆う四角ポリゴンにはっつけて表示確認したんですね。
そしたら、なんか描画したはずの絵の4分の1の領域しかポリゴンに貼られてないでやんの。
自作ライブラリのバグか? テクスチャをポリゴンに貼っつける処理でケアレスミスか?
と色々調べたけど、どれも正常。
そこでOpenGL Profilerでテクスチャ画像を見てみると、
レンダリングしたはずの絵の4分の1の部分しか映っていない。
つまり、FBOへのレンダリングの時点で失敗している。
なんでよ!?
小一時間悩んだ結果、もしかして、とおもって
GLint originalViewport[4];
glGetIntegerv(GL_VIEWPORT, originalViewport);
してみた。そしたら、取れたのは
[0, 0, 1024, 1024]
ちなみに、GLFW(GLUTの代替ライブラリです)のウィンドウに指定したサイズは512, 512なんです。
gp_window = glfwCreateWindow(512, 512, "Hello!", NULL, NULL);
はっはーん。
Retinaだなw
つまり、glfwCreateWindowで指定するサイズは、あくまで論理ピクセルサイズ(適当に今命名、ホントはちゃんとした用語があるはずだけど)
なんですね。Retinaディスプレイでの物理ピクセルサイズは、縦横それぞれ2倍になるので、
実際にウィンドウに描画されるピクセルは1024, 1024なんです。
だから、Viewportも自動的に[0, 0, 1024, 1024]に設定されていた。
でも、私はFBOのテクスチャのサイズを、GLFWに設定した論理ピクセルサイズ512, 512と同じ数値で指定してしまった。
そのテクスチャ(512,512)に対し、Viewport設定[0, 0, 1024, 1024]のままレンダリングしてしまったので、
4分の1の領域しかテクスチャに描かれなかったわけです。
FBOへのレンダリング時のみ、Viewportサイズを[0, 0, 512, 512]にすることで、解決しました。
いや、これちょっとした落とし穴ですねw