1

現在、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.FrontToBackSpriteSortMode.Deferred

4

0 に答える 0