在XNA中运行时从图像加载纹理有什么风险?

时间:2012-08-22 17:14:31

标签: xna runtime textures

有什么可以了解(除了只能在PC上执行此操作)在运行时从图像加载纹理?

1 个答案:

答案 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,然后将其重新填充到纹理中。没有这个,你的精灵可能会显得更亮/更暗?比他们应该的。 (免责声明:我没有写上面的方法,我的朋友做了)

相关问题