OpenGLでD3DFMT_G16R16Fの形式テクスチャを作る方法について説明します。
これをマスターすれば、32bit float形式も、R16F, R32F形式にも対応できます。
これをマスターすれば、32bit float形式も、R16F, R32F形式にも対応できます。
■必要なもの
- GL_RGBA16F, GL_RGBA32F などフォーマットを使えること
- OpenGL拡張の GL_ARB_texture_rg
- OpenGL拡張の GL_ARB_texture_swizzle
■確認した動作環境
- NVIDIA GeForce9800GT
- ATI RADEON HD 5450
どちらも入手できる最新ドライバにて。
■方法説明
*テクスチャの準備
ケース1 GL_ARB_texture_rg がある場合
何も考えなくてもRGテクスチャが作れます。
D3DFMT_G16R16Fの場合 glTexImage2D( GL_TEXTURE_2D, 0, GL_RG16F, w, h, 0, GL_RG, GL_HALF_FLOAT, pDataImage );
このような感じで作れてしまいます。
楽になりました。
ケース2 GL_ARB_texture_rg がない場合
仕方ないのでRGBA16FやRGBA32F形式のテクスチャを作り代替させます。
*テクスチャの設定
ケース1,2どちらにしてもこのままではDirectX9と同じ挙動となりません。
それは、DirectXでは存在しない要素に対しては”1″を返し、
OpenGLでは存在しない要素に対しては”0″を返すためです。
これを共通の振る舞いをさせる設定を行います。
GL_ARB_texture_swizzleのおかげでこの切り替えを行うことができます。
なかなか強力な機能なので有効に使っていきましょう。
D3DFMT_G16R16Fの例
アルファとブルーの成分が常に1を返すようにスウィズル設定を行います。
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_A, GL_ONE ); glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_B, GL_ONE );
これまでの適用により全く同じ見た目になるように挙動を修正することができます。
■まとめ
GL_ARB_texture_swizzleはかなり便利です。
包含するようなテクスチャ形式を用意できれば、この機能を使って
OpenGL側でいろいろと出来ます。
■お願い
GL_ARB_texture_swizzleとかrgとかが、どのくらいの環境で使用可能なのかがわかりません。
よろしければ、お使いの環境でどうであったかや、知っている環境でどうであったかなどの情報をお待ちしております。
コメント
ここ↓の OpenGL Caps の結果を見ると
http://www2.ocn.ne.jp/~inu_inu/opengl/main.htm
nVIDEA は最新ドライバを入れれば DirectX 9 世代でも
両方サポートしているようです。
AMD780G は GL_ARB_texture_rg はあるけど
GL_ARB_texture_swizzle はサポートしてないようです。
やすさん、情報ありがとうございます。
rgサポートするけど、swizzleのほうはサポートしないとかその傾向にはちょっと驚きました。
DirectX観点からは確かにrgのほうがサポート出来るのは分かるのですが、
世代的に前のswizzleのほうがサポートされないとは。
AMD780GでRGサポートのみという点からも、rgのほうが上位に位置するのかもしれませんね。
あれあれ…良く見たら AMD780G は
GL_ARB_texture_swizzle はサポートしてないですが
GL_EXT_texture_swizzle はサポートしてました。
気になったので OpenGL.org で調べてみたところ
Revision 3, 2009/12/07
– Rename EXT->ARB
去年の終わりにEXTからARBに昇格してますね。
どうやら同一のようで、AMD780G でも使えるようです。
お騒がせしました。
やすさん、追加調査報告をありがとうございます。
EXT版ではswizzleもサポートしているとのことで、無事に使えそうですね。
ドライバ更新でこのあたりも一気にEXTからARBへと昇格しそうではありますし、
やはりOpenGLはドライバ依存が酷いのは相変わらずですね。