現在、XNA で小さなウィンドウ クリーニング ゲームを開発しており、ランダムな画像の上に汚れのレイヤー (さまざまなアルファを持つ 2D テクスチャ) を描画します。汚れの層は、プレイヤーが窓をきれいにすればするほど透明になるはずです。
コードは次のようになります。
ScreenManager.SpriteBatch.Begin(SpriteSortMode.BackToFront, BlendState.NonPremultiplied);
// draw the dirt
ScreenManager.SpriteBatch.Draw(_currentDirt, ScreenManager.GameRectangle, Color.White);
// draw the image
ScreenManager.SpriteBatch.Draw(_currentImage, ScreenManager.GameRectangle, Color.White);
ScreenManager.SpriteBatch.End();
1 台の PC (NVIDIA Quadro 1000M グラフィック カードを搭載) では、アルファ ブレンディングは魔法のように機能し、効果は期待どおりに機能します。2 台目の PC (AMD Radeon HD 7730M を搭載) でまったく同じコードを実行すると、汚れの層が表示されません。
3 台目の PC (ATI Mobility Radeon HD 2600 を搭載) でもコードをテストしました。ここで、効果は再び期待どおりに機能しました。
2 台目の PC のグラフィック カードが問題の原因であると推測していますが、正直なところよくわかりません。両方のマシンで実行するようにコードを変更する必要がある、または変更できる方法、またはここで何が問題になっているのか考えていますか?
ご助力ありがとうございます。
よろしく、
トーマス
更新:
アルファ ブレンディングが機能する PC の 1 つでのゲームのスクリーンショット:
アルファ ブレンディングが機能しない PC 上のゲームのスクリーンショット:
更新 2:
画像はランダムに選択され、効果には影響しません。
LoadContent
私は次のようなことをします :
// load the image
Texture2D _currentImage = new Sprite(ScreenManager.Content.Load<Texture2D>("anyImage"));
// create the dirt texture
int _nrPixelsDirt = ScreenManager.GameRectangle.Height * ScreenManager.GameRectangle.Width;
Color[] _currentDirtColor = new Color[_nrPixelsDirt];
for (int i = 0; i < _currentDirtColor.Length; i++)
{
_currentDirtColor[i] = new Color(Color.Gray.R, Color.Gray.G, Color.Gray.B, 255);
}
Texture2D _currentDirt = new Texture2D(ScreenManager.GraphicsDevice, ScreenManager.GameRectangle.Width,
ScreenManager.GameRectangle.Height, false, SurfaceFormat.Color);
// set the data
_currentDirt.SetData(_currentDirtColor);
で、Update
適切な位置のアルファ値を徐々に減らして_currentDirtColor
(ゼロにクランプ)、データを再度設定します。
_currentDirt.SetData(_currentDirtColor);
のコードは次のDraw
ようになります。
ScreenManager.SpriteBatch.Begin(SpriteSortMode.BackToFront, BlendState.NonPremultiplied);
// draw the dirt
ScreenManager.SpriteBatch.Draw(_currentDirt, ScreenManager.GameRectangle, Color.White);
// draw the image
ScreenManager.SpriteBatch.Draw(_currentImage, ScreenManager.GameRectangle, Color.White);
ScreenManager.SpriteBatch.End();
SpritSoreMode
私はすでに別の値を試しました:異なるマシンで同じ結果を生成SpriteSortMode.BackToFront
しますが、3 つのマシンのいずれでも機能しません。SpriteSortMode.FrontToBack
SpriteSortMode.Deferred