Xna4.0中使用Texture2D.FromStream加载png图像的问题

当XNA要嵌入到WPF中时,不能使用ContentManager加载纹理而直接用Texture2D.FromStream加载。但是用Texture2D.FromStream加载半透明的png图像时,发现纹理与原图不一致,特别是半透明的信息基本都丢失了,图像变得一团糟。

具体效果如图:

从左到右依次为:使用ContentManager加载、使用 Texture2D.FromStream加载和使用 Texture2D.FromStream加载后进行处理的结果。

可见对于半透明的png图像,如果使用Texture2D.FromStream加载后直接渲染,效果十分差,必须进行处理。我们可以使用下面这个静态方法进行处理:

复制代码
1 private static void PreMultiplyAlphas(Texture2D ret)
2 {
3     Byte4[] data = new Byte4[ret.Width * ret.Height];
4     ret.GetData<Byte4>(data);
5     for ( int i = 0; i < data.Length; i++)
6     {
7         Vector4 vec = data[i].ToVector4();
8         float alpha = vec.W / 255.0f;
9         int a = ( int)(vec.W);
10         int r = ( int)(alpha * vec.X);
11         int g = ( int)(alpha * vec.Y);
12         int b = ( int)(alpha * vec.Z);
13         uint packed = ( uint)(
14             (a << 24) +
15             (b << 16) +
16             (g << 8) +
17             r
18             );
19
20         data[i].PackedValue = packed;
21     }
22     ret.SetData<Byte4>(data);
23 }
复制代码

从方法是从MSDN论坛上找到的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值