3
有什么需要了解的(除了只能够做到这一点的PC)加载纹理从图像在运行时?XNA在运行时从图像加载纹理的风险是什么?
有什么需要了解的(除了只能够做到这一点的PC)加载纹理从图像在运行时?XNA在运行时从图像加载纹理的风险是什么?
我已经完全从流加载我的纹理,以及,唯一的“危险”,我可以拿出预乘的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);
}
正如你所看到的,它的作用是阿尔法乘颜色通道,那么它的东西放回质感。如果没有这个,你的精灵可能会看起来更明亮/更黑暗?比他们应该。 (免责声明:我没有写上面的方法,我的一个朋友做)
我真的没有得到预乘alpha的问题,我的意思是我从来没有见过任何东西在我的项目的尴尬。你可以发布一张图片,显示它是什么? – user1306322
这可能是值得的几个地方,如[百科](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),你的颜色将被关闭,如果你不预乘你阿尔法,或使使用NonPremultiplied blendstate。这是非常简单的修复。当我回到家时,我会在这里粘贴我的代码。 –
@ user1306322,这是一个很好的问题,它处理不使用预乘alpha的问题:http://gamedev.stackexchange.com/questions/21199/why-do-my-sprites-have-a-dark-shadow-线帧包围最纹理 –