08/03/03 17:34:28 Q5EkCE5+
>>706 こんな感じです。
// 抜きスプライトを描画
spriteBatch.Begin(SpriteBlendMode.AlphaBlend, SpriteSortMode.Immediate, SaveStateMode.SaveState);
GraphicsDevice.RenderState.DepthBufferEnable = true;
GraphicsDevice.RenderState.ReferenceAlpha = 128;
spriteBatch.Draw(...)
spriteBatch.End();
// 半透明のスプライトを描画
spriteBatch.Begin(SpriteBlendMode.AlphaBlend, SpriteSortMode.Immediate, SaveStateMode.SaveState);
GraphicsDevice.RenderState.DepthBufferEnable = true;
GraphicsDevice.RenderState.DepthBufferWriteEnable = false;
spriteBatch.Draw(...)
spriteBatch.End();
// Additveのスプライトを描画
spriteBatch.Begin(SpriteBlendMode.Additive, SpriteSortMode.Immediate, SaveStateMode.SaveState);
GraphicsDevice.RenderState.DepthBufferEnable = true;
GraphicsDevice.RenderState.DepthBufferWriteEnable = false;
spriteBatch.Draw(...)
spriteBatch.End();
// メニュー部分を描画
spriteBatch.Begin();
spriteBatch.Draw(...)
spriteBatch.End();
抜きテクスチャを描画する時にZバッファと、Alphaテストを使うのがコツです。こうするとAlpha値が1のものだけが
描画されると同時にZバッファも更新されるのでちゃんとしたdepthを指定すれば順不同に描画しても問題ありません
次にの半透明部分ですが、前の描画でZバッファには情報が入っているので既に描かれているものより手前のピクセルしか描画しません。
Zバッファは参照するけど、更新はしないというのがミソです。続くAddtiveの部分も一緒です。
これで見た目上一番問題のある抜きスプライトとそれ以外のスプライトの前後関係は正しくなります。ただし、半透明同士が重なったとき
の前後関係はおかしくなりますが、見た目上の問題は大幅に減るはずです。