実はテクスチャ座標も正しくシェーダー側へ渡せてないことが分かりました。
うまく値が渡るのは頂点カラーのみ。これらの結果から、
GL_ARB_vertex_program の各頂点属性のインデックス値が、
仕様通りに動くのは NVIDIAのみということになります。
vertex_programを使用時においてどの環境でも動くためには、
EnableVertexAttribArray系ではなく、glEnableClientStatus系で有効にして、
頂点データ属性のセットには、glXXXXPointer系を使う必要があるということになります。
このvertex_programやfragment_programのシェーダーについて、
GLARBシェーダーとここでは表記することにします。
■FBO未使用でのテクスチャレンダリング
GL_ARB_framebuffer_objectを使えない時のテクスチャレンダリングの話です。
使用しそうな場面としては、以下のような状況があるかと思います。
- GLSL使えないとき(GLver2.0未満)の場合
- ドライバが対応していないものを使用している場合
意外と古いドライバでは FBOが使えなかったりします。
それと古い環境で、DirectX9.0とGLの対応を行う場合に、
OpenGLでテクスチャレンダリングする場合にこの方法が必要になるかと思います。
これから説明する方法はパフォーマンスがあまりよくはありません。
しかしながら、制限された環境で、両者互換を取る場合には仕方ないかなと思っています。
*wglCreatePbufferARBでPBufferを使う
OpenGLのP-Bufferというものを使います。
これはオフスクリーン描画のためのバッファです。
ただし、この拡張はプラットフォーム依存が酷く、マルチ展開は厳しいです。
また、FBOに比べて使い勝手が悪いです。
P-Bufferを用いて描画の方法はサンプルもそこそこあるので、
ここでは手順だけ説明します。
- P-Bufferを作成
- メインのGLコンテキストとリソース共有出来るようにwglShareListsを呼び出しておきます。
- テクスチャに書き込みたいシーンをP-Bufferを現在のコンテキストに設定して描画
- glCopyTexSubImage2Dを呼び出して、描画したシーンをテクスチャに転送
- P-Bufferでのコンテキストの各値をメインにコピー
- 必要がないなら不要。wglCopyContextでコピーできる
- コピーしておくとテクスチャレンダリングパスでのクリア値とかを引き継げる
- コピー有無にかかわらず、頂点属性のセット値は引き継がれない。
- メインのコンテキストに戻す。
- ビューポートやシザーの再セット
これらの手順により、描画結果をテクスチャに落とし込めます。
glReadPixels命令でも一応可能ですが、それよりはこちらの方が若干マシです。
■まとめ
OpenGL 2.0対応していて、FBOが使える状況ではまず必要にならない方法でした。
最近だと2.0あたりに対応はしているはずなので、あまり役に立たないかも。
P-Bufferなんて昔の話と思っていたので、まさか実際に触ってみる日が来るとはびっくりです。
Intel GMA950あたりで動かそうと思ったが運の尽きってことで。
勉強にはなったと思いますが…。