3

关于在运行时从图像加载纹理(除了只能在 PC 上做到这一点)有什么要了解的?

4

1 回答 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 回答