Xna4.0中使用Texture2D.FromStream加载png图像的问题
最近使用WPF+XNA制作编辑器,因为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 }
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论坛上找到的。