我目前正在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
不适用于三台计算机中的任何一台