忍者ブログ

Memeplexes

プログラミング、3DCGとその他いろいろについて

XNAで透過

Microsoftのゲーム開発ツールであるXNAで透過を行いたいときの注意についてメモしておきます。

XNAでは、(というか、これはXNAに限ったことではないのですが、)表示するものを透明にすることが出来ます。
これは、ゲームを作るときに、例えばビームや爆発の炎などの、奥が透けて見えるものを表示するのに役に立つでしょう。

ちょうどこんな感じです:
adb7b883.JPG
(この炎のイメージはXNA Creators Club OnlineのサンプルParticle 3D Sampleのexplosion.pngを利用しています。)






3つの炎のイメージが重なって表示されています。奥のほうの炎が透けて見えます。

xnaAlphaBlending2.JPG










ちなみに、透過を行わなかったら奥の炎は透けて見えません。
noAlphaBlending.JPG









透過を有効にするには描画直前に次のようにします。

GraphicsDevice.RenderState.AlphaBlendEnable = true;
GraphicsDevice.RenderState.AlphaBlendOperation = BlendFunction.Add;
GraphicsDevice.RenderState.SourceBlend = Blend.SourceAlpha;
GraphicsDevice.RenderState.DestinationBlend = Blend.One;

しかしこのままでは問題があって、それは何かというと、炎の描画の順番によって炎が透けないことがあるということです。(つまり回転させると、透けたり透けなかったりします。)
xnaAlphaBlending3.JPG
(上の4行以外に何もしないと、中途半端に透明になります。ここでは、一番右の炎が手前の炎のイメージに隠れてしまっています。一方、左奥の炎は透けて見えます。これは、透けるか透けないかに3つの炎を描画する順番が関係しているためです。)






次の行を追加すると、問題が解決されるようです。(一番初めの画像のようになります)

GraphicsDevice.RenderState.DepthBufferWriteEnable = false;

拍手[0回]

PR