关于在运行时从图像加载纹理(除了只能在 PC 上做到这一点)有什么要了解的?
问问题
487 次
1 回答
4
我也一直专门从流中加载我的纹理,我能想到的唯一“危险”是预乘 Alphas。您要么需要在加载每个纹理时对其进行处理,要么在禁用预乘 alpha 的情况下进行渲染。Shawn Hargreaves就这个主题写了一篇很棒的博客文章。在评论中,他提到:
如果您没有通过我们的内容管道,您必须自己处理格式转换,或者只是不使用预乘 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,然后将其填充回纹理中。没有这个,你的精灵可能会显得更亮/更暗?比他们应该的。(免责声明:上面的方法不是我写的,我的一个朋友写的)
于 2012-08-22T19:50:25.243 回答