OpenGLレンダラーを備えたAutodeskMotionBuilderというアプリケーションのプラグインを作成しており、テクスチャジオメトリをシーンにレンダリングしようとしています。3Dビューが埋め込まれたウィンドウがあり、ウィンドウがレンダリングされるたびに、これが(簡単に言えば)何が起こるかです。
- 与えられたサイズの領域に描画しようとしていることをレンダラーに伝えます
- その領域にMotionBuilderシーンを描画するようにレンダラに指示します
- シーンの中や上に追加のものを描画します
ここでの課題は、MotionBuilderのレンダラーから任意のOpenGL状態を継承していることです。これは、描画内容とシーンに存在する内容によって異なります。私はこれまでこの問題に対処してきましたが、理解できないことが1つあります。OpenGLが私のUV座標を解釈する方法は、MotionBuilderが私の背後で行っていることに基づいて変化するようです。
これが私のレンダリングコードです。シーンにテクスチャジオメトリがない場合、つまりMotionBuilderがテクスチャ関連の属性をまだいじっていない場合は、期待どおりに機能します。
// Tell MotionBuilder's renderer to draw the scene
RenderScene();
// Clear whatever arbitrary state MotionBuilder left for us
InitializeAttributes(); // includes glPushAttrib(GL_ALL_ATTRIB_BITS)
InitializePerspective(); // projects into the scene / loads matrices
// Enable texturing, bind to our texture, and draw a triangle into the scene
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, mTexture);
glBegin(GL_TRIANGLES);
glColor4f(1.0, 1.0, 1.0, 0.5f);
glTexCoord2f(1.0, 0.0); glVertex3f(128.0, 0.0, 0.0);
glTexCoord2f(0.0, 1.0); glVertex3f( 0.0, 128.0, 0.0);
glTexCoord2f(0.0, 0.0); glVertex3f( 0.0, 0.0, 0.0);
glEnd();
// Clean up so we don't confound MotionBuilder's initial expectations
RestoreState(); // includes glPopAttrib()
ここで、テクスチャを含むメッシュをいくつか取り込むと、奇妙なことが起こります。テクスチャ座標が大きくなります。前後は次のとおりです。
(出典:awforsythe.com)
右側のクローズアップからわかるように、MotionBuilderは、ファイルが見つからないテクスチャをレンダリングするように求められると、代わりにこの小さな疑問符テクスチャをロードして、ジオメトリ全体に並べて表示します。私の唯一の仮説は、MotionBuilderがグローバルテクスチャ座標スカラーを変更しているため、たとえば、glTexCoord2f(0.5、1.0)が(50.0、100.0)であるかのように解釈されるというものです。OpenGLにそのような機能はありますか?入力したテクスチャ座標を保持するために何を変更する必要があるか考えてみてください。
上記を入力してから少し調べてみると、この効果に使用されるGL_TEXTUREマトリックスがあることがわかりました。きちんとした!そして確かに、私が最初にこの行列の値を取得するとき、それは古き良き単位行列です:
1 0 0 0
0 1 0 0
0 0 1 0
0 0 0 1
MotionBuilderがテクスチャ座標を調整した後、もう一度確認すると、次のようになります。
16 0 0 0
0 16 0 0
0 0 1 0
0 0 0 1
なんてことだ!ただし、ここにわずかな問題があります。MotionBuilderが何をしているかに関係なく、独自の描画を行う前にテクスチャマトリックスを明示的に設定しようとすると、テクスチャ座標は効果がなく、テクスチャの左下隅をサンプリングするだけです( 0.0、0.0)すべての頂点に対して。
RenderScene
上記のコードの後に配置された、試行された修正は次のとおりです。
glMatrixMode(GL_TEXTURE);
glLoadIdentity();
GL_TEXTURE_MATRIXの値が単位行列になったことを確認できますが、glTexCoord2fで指定した座標に関係なく、各頂点の座標が(0.0、0.0)であるかのように常に描画されます。
(出典:awforsythe.com)
OpenGLが私のテクスチャ座標をどのように解釈するかに影響を与える可能性のある他のアイデアはありますか?