1

我目前正在 XNA 中开发一个小型窗户清洁游戏,在其中我在任何随机图像上方绘制一层污垢(具有不同 alpha 的 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();

在一台 PC(配备 NVIDIA Quadro 1000M 显卡)上,alpha 混合就像一个魅力,效果如预期。在第二台 PC(配备 AMD Radeon HD 7730M)上执行完全相同的代码无法显示污垢层。
我还在第三台 PC(配备 ATI Mobility Radeon HD 2600)上测试了代码。在这里,效果再次按预期工作。

我认为第二台 PC 上的显卡是造成问题的原因,但老实说我不确定。您是否知道我应该或可以如何更改代码以在两台机器上运行,或者这里出了什么问题?

非常感谢您的帮助。

最好的问候,
托马斯

更新:
其中一台 alpha 混合工作的 PC 上的游戏截图:示例工作

PC 上 alpha 混合不起作用的游戏截图:示例不工作

更新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(钳制为零)中适当位置的 alpha 值,然后我再次设置数据:

_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();

我已经尝试了不同的值SpritSoreModeSpriteSortMode.BackToFrontSpriteSortMode.FrontToBack在不同的机器上产生相同的结果,SpriteSortMode.Deferred在三台机器中的任何一台上都不起作用。

4

0 回答 0