アルファブレンディング
アルファブレンディングとは、二つの画像を半透明値(アルファ値)を元に、半透明合成することです。(ホントかな?)DirectDrawの時代にいつかは実装すると言っていたこの機能ですが、結局実装されることがなくDirectGraphicsに統合されてしまいました。DirectGraphicsでは、3D対応のビデオカードの力を借りて非常に高速に行えます。しかも、Direct3D,Deviceの設定をちょっと変えるだけですぐに適応できます。
今回のサンプルプログラム
GraphicsBで作ったプログラムをさらに改良します。半透明合成されていて、ちょっとうれしい感じです。
Direct3DSample4左の画面が今回のサンプルプログラムです。前回の四角と画像のクルクルに加えて、片方の画像を半透明合成しています。 |
プロジェクトは前回のものに改造を加えるので、前回のコードをベースに作っていきます。DirectGraphicsBのサンプルプログラムをダウンロードして置いてください。
アルファブレンディングを有効にする
テクスチャーを使ったアルファブレンディングを有効にするには、@アルファブレンディングを有効にする Aアルファ合成の方法を指定する Bテクスチャのアルファ合成方法を指定する の3つの作業を行うだけですみます。まずは、@のアルファブレンディングを有効にします。
Direct3D.Deviceの初期化処理に次の一文を追加してください。
public CLKsDG(System.Windows.Forms.Control wind) { Microsoft.DirectX.Direct3D.PresentParameters param = new PresentParameters(); param.Windowed = true; param.SwapEffect = SwapEffect.Discard; param.PresentationInterval = PresentInterval.Immediate; device = new Microsoft.DirectX.Direct3D.Device(0, Microsoft.DirectX.Direct3D.DeviceType.Hardware,wind, CreateFlags.SoftwareVertexProcessing, param); device.RenderState.CullMode = Cull.None; device.RenderState.Lighting = false; //-----アルファ値設定 device.RenderState.AlphaBlendEnable= true; ... |
「RenderState.AlphaBlendEnable」プロパティにTrueをセットすることで、@の設定は終了です。
アルファブレンディングの値設定
次にAの設定です。さらに以下の文を追加してください。
public CLKsDG(System.Windows.Forms.Control wind) { Microsoft.DirectX.Direct3D.PresentParameters param = new PresentParameters(); param.Windowed = true; param.SwapEffect = SwapEffect.Discard; param.PresentationInterval = PresentInterval.Immediate; device = new Microsoft.DirectX.Direct3D.Device(0, Microsoft.DirectX.Direct3D.DeviceType.Hardware,wind, CreateFlags.SoftwareVertexProcessing, param); device.RenderState.CullMode = Cull.None; device.RenderState.Lighting = false; //-----アルファ値設定 device.RenderState.AlphaBlendEnable= true; device.RenderState.SourceBlend = Blend.SourceAlpha; device.RenderState.DestinationBlend = Blend.InvSourceAlpha; … |
テクスチャブレンディングの設定
Bのテクスチャのアルファ合成方法を設定します。
public CLKsDG(System.Windows.Forms.Control wind) { Microsoft.DirectX.Direct3D.PresentParameters param = new PresentParameters(); param.Windowed = true; param.SwapEffect = SwapEffect.Discard; param.PresentationInterval = PresentInterval.Immediate; device = new Microsoft.DirectX.Direct3D.Device(0, Microsoft.DirectX.Direct3D.DeviceType.Hardware,wind, CreateFlags.SoftwareVertexProcessing, param); device.RenderState.CullMode = Cull.None; device.RenderState.Lighting = false; //-----アルファ値設定 device.RenderState.AlphaBlendEnable= true; device.SetTextureStageState( 0,TextureStageStates.AlphaOperation, (int)Microsoft.DirectX.Direct3D.TextureOperation.Modulate); device.SetTextureStageState(0,TextureStageStates.AlphaArgument1, (int)Microsoft.DirectX.Direct3D.TextureArgument.TextureColor); device.SetTextureStageState(0,TextureStageStates.AlphaArgument2, (int)Microsoft.DirectX.Direct3D.TextureArgument.Current); device.RenderState.SourceBlend = Blend.SourceAlpha; device.RenderState.DestinationBlend = Blend.InvSourceAlpha; |
これでアルファブレンディングの設定は完了です。
半透明転送
さて、アルファブレンディングの設定が完了したので、今度は使い方を紹介しましょう。C#(というか、.NET)は標準でアルファ値をサポートしているので、その機能をそのまま使ってアルファ値の指定を行います。前回作ったDrawTextureメソッドのColorの部分に、アルファつきのColor構造体を渡せば完了です。
dgdevice.DrawTexture(logo, |
Color構造体のFromArgbメソッドには「アルファ値(0〜255), 赤(0〜255), 緑(0〜255), 青(0〜255)」を指定できるオーバーロードがあるため、これを利用して任意の透明度を指定できます。これは、テクスチャーを描画する場合だけではなく、あらゆるポリゴンを描画する場合に適応されます。
スプライト転送
キャラクターの背景を透過して画像を転送することをスプライト転送といいます。今回設定したアルファブレンディングでは、頂点のアルファ値とテクスチャのアルファ値を合成するため、テクスチャ自体に透過設定を行うことで簡単にスプライト転送が実現できます。CLKsDGクラスの画像の読み込みは、.NETのBitmapクラスを利用しているためGIFやPNGなどのアルファ情報を持った画像をそのまま読み込むことができます。また、PNG-24を用いれば半透明のアルファ情報を用いたテクスチャーの転送も可能になります。こういった透明情報を持った画像はAdobe PhotoShopなど市販の画像編集ソフトがあれば簡単に作ることができます。
まとめ
これで、画像描画はほぼ完璧ですね。DirectInputも紹介してあるので、ゲームに必要な基本機能は大体そろったでしょう。音系がまだか。
次回は「RenderState」をいじって光の効果を出したりとちょっとしたテクニックを紹介したいと思います。
追加:ライトのオフ
プログラムを動かす環境によっては、この設定を行わないと正しくテクスチャーマッピングされない場合があります。
//-----アルファ値設定 device.RenderState.AlphaBlendEnable= true; device.SetTextureStageState( 0,TextureStageStates.AlphaOperation, (int)Microsoft.DirectX.Direct3D.TextureOperation.Modulate); device.SetTextureStageState(0,TextureStageStates.AlphaArgument1, (int)Microsoft.DirectX.Direct3D.TextureArgument.TextureColor); device.SetTextureStageState(0,TextureStageStates.AlphaArgument2, (int)Microsoft.DirectX.Direct3D.TextureArgument.Current); device.RenderState.SourceBlend = Blend.SourceAlpha; device.RenderState.DestinationBlend = Blend.InvSourceAlpha; //ライトをオフにする |
前回のテクスチャマッピングで触れるのを忘れていました。。。(2006/03/17追加)
「Device.RenderState.Lighting」をfalseに設定してください。ここらへんは、今後3Dをやるときに説明することにしましょう〜