有什么可以了解(除了只能在PC上执行此操作)在运行时从图像加载纹理?
答案 0 :(得分:4)
我一直专门从流中加载我的纹理,而我能想出的唯一“危险”就是Premultiplied Alphas。您需要在加载时处理每个纹理,或者在禁用预乘alpha的情况下进行渲染。肖恩哈格里夫斯写了great blog article on this subject。在评论中,他提到:
如果您没有浏览我们的内容管道,您必须自己处理格式转换,或者不使用预乘alpha
因此,使用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,然后将其重新填充到纹理中。没有这个,你的精灵可能会显得更亮/更暗?比他们应该的。 (免责声明:我没有写上面的方法,我的朋友做了)