2012-08-22 25 views

回答

3

我已经完全从流加载我的纹理,以及,唯一的“危险”,我可以拿出预乘的Alpha。您需要在加载时处理每个纹理,或者在预乘alpha的情况下禁用。肖恩哈格里夫斯写了一个great blog article on this subject。在评论,他提到:

如果不经过我们的内容管道,你必须自己处理格式转换,或者只是不使用预乘alpha

所以初始化你的精灵批(es)与BlendState.NonPremultiplied应该工作。

在我的比赛,我已经处理每个纹理,当我加载它。

编辑:这里是我的方法:

private static void PreMultiplyAlphas(Texture2D ret) 
{ 
    var data = new Byte4[ret.Width * ret.Height]; 
    ret.GetData(data); 
    for (var i = 0; i < data.Length; i++) 
    { 
     var vec = data[i].ToVector4(); 
     var alpha = vec.W/255.0f; 
     var a = (Int32)(vec.W); 
     var r = (Int32)(alpha * vec.X); 
     var g = (Int32)(alpha * vec.Y); 
     var b = (Int32)(alpha * vec.Z); 
     data[i].PackedValue = (UInt32)((a << 24) + (b << 16) + (g << 8) + r); 
    } 
    ret.SetData(data); 
} 

正如你所看到的,它的作用是阿尔法乘颜色通道,那么它的东西放回质感。如果没有这个,你的精灵可能会看起来更明亮/更黑暗?比他们应该。 (免责声明:我没有写上面的方法,我的一个朋友做)

+0

我真的没有得到预乘alpha的问题,我的意思是我从来没有见过任何东西在我的项目的尴尬。你可以发布一张图片,显示它是什么? – user1306322

+0

这可能是值得的几个地方,如[百科](http://en.wikipedia.org/wiki/Alpha_compositing#Alpha_blending)以及更多[肖恩的博客(HTTP阅读一些更多关于预乘阿尔法://博客。 msdn.com/b/shawnhar/archive/2009/11/10/premultiplied-alpha-in-xna-game-studio.aspx)。从我收集的,如果你使用的阿尔法(RGBA),你的颜色将被关闭,如果你不预乘你阿尔法,或使使用N​​onPremultiplied blendstate。这是非常简单的修复。当我回到家时,我会在这里粘贴我的代码。 –

+0

@ user1306322,这是一个很好的问题,它处理不使用预乘alpha的问题:http://gamedev.stackexchange.com/questions/21199/why-do-my-sprites-have-a-dark-shadow-线帧包围最纹理 –