つくづく私の脳ミソは抜けているのですが、先ほど就職活動中にその会社のトップとの面接を遅刻していくあたり、
いい加減なにか重要なものが抜け落ちているとしか思えません。つーかこれ去年も同じことやったよなぁ・・・ そんなわけで今回は抜けた脳ミソでDirectX8の抜きであるところのアルファブレンディングについてです。
といっても面白いネタがあるわけでも無いんですけどね、まぁ忘れないうちに。 さてさてDirectXも8になってD3DXライブラリが非常に重要な存在になってきました。
事実上RMが無くなった今、穴埋めはこいつにしてもらわなけりゃならんわけです。 さすがにポリゴンオブジェクトの扱いがRM並に簡単になるわけも無かったんですが、それでも色々便利に拡張されています。
初期化が異常に簡単になった今、D3DXは初期化ライブラリとしての役目を終えて、真に実用的な部分に注力されてる気がします。 で、一番恩恵がでかいのがテクスチャの扱いじゃないかと思うわけです。
BMP、TGA、PNG、JPG、DIB、PPM、DDSなど多種多様なファイルフォーマットに対応しつつ、 D3DXCreateTextureFromFileExの引数にD3DPOOL_MANAGEDを指定しておけば、サーフェースロストの対応なんかや、
VRAM管理なんかを勝手にやってくれる親切さっぷり。 DirectX7以前でそのあたりに苦労した皆さんはご愁傷様って感じです。 ついでに他の引数でカラーキーを指定できたりもするんで、抜き色合成もお手軽にできちゃったりします。
いや〜、便利便利。 こいつと合わせてD3DCreateSpriteでスプライトを作ってあげれば、2Dがらみの描画ルーチンは一瞬で完成ですよ、うひょー。
などとおもってうはうはやっていたのですが、どうやらこのスプライト君α合成がうまく動かないっぽい。 単純な半透明は問題ないんですが、レンダリングステートをいじって加算合成しようとしても普通の半透明にしかならない模様。
爆発with加算合成で萌え萌えな人たちは悲しくなってしまうわけなんですね。 そんなわけでD3DXスプライトがらみはポイして、2Dポリゴンで代用した方が良いようです。
なにやらD3DXスプライトは遅いという噂もあるみたいですし。 αブレンディングのやり方自体は以前のDirectXの方法と変わりありません。
SetRenderState( D3DRS_ALPHABLENDENABLE, TRUE ); SetRenderState( D3DRS_SRCBLEND,
D3DBLEND_SRCALPHA ); SetRenderState( D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA
); こんな感じでレンダリングステートを設定して描画してやればいいんですが、 気をつけなければならないのが、不透明物体を先に描画しておいてあげること。
これもいつもどおりです。 Zバッファへの書き込みは不透明物体のときはON、透明物体のときはOFFにしときましょう。
SetRenderState( D3DRS_ZWRITEENABLE, TRUE ); 不透明物体->Render(); SetRenderState(
D3DRS_ZWRITEENABLE, FALSE ); 透明物体->Render() 透明物体の描画は奥にある奴から順にやってあげます。
α値の扱いはこんな感じで、テクスチャとマテリアルをちゃんぽんに使って SetTextureStageState( 0, D3DTSS_ALPHAOP,
D3DTOP_MODULATE ); SetTextureStageState( 0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE
); SetTextureStageState( 0, D3DTSS_ALPHAARG2 ,D3DTA_DIFFUSE ); 色の扱いはこんな感じで、こっちもテクスチャとマテリアルをちゃんぽんに使って
SetTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_MODULATE ); SetTextureStageState(
0, D3DTSS_COLORARG1, D3DTA_TEXTURE ); SetTextureStageState( 0, D3DTSS_COLORARG2,
D3DTA_DIFFUSE ); 抜き色を使うにはαテストもONにしておかないと駄目だったかも。
SetRenderState( D3DRS_ALPHATESTENABLE, TRUE )
そもそもαテストってなんだったっけという気もしてきたので、こちら。
こんなもんでしょうか、なんでこれしきのことに半日も悪戦苦闘していたのでしょうか(笑) 半分はPhotoShopのPNGファイルの扱いが馬鹿だったことに起因するんですが・・・(日記参照)
まぁ、うろ覚えな知識の再確認ができただけでも良かったということで。 |