我目前正在 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();
我已经尝试了不同的值SpritSoreMode
:SpriteSortMode.BackToFront
并SpriteSortMode.FrontToBack
在不同的机器上产生相同的结果,SpriteSortMode.Deferred
在三台机器中的任何一台上都不起作用。