在XNA中绘制纹理基元时如何保留/保留PNG透明度?

时间:2015-04-19 19:12:31

标签: c# xna textures transparency

我创建了一个粒子系统,它绘制了许多基元并为它们添加了纹理。源精灵是具有透明度的PNG图像,但是当我使用下面的代码在XNA中绘制时,透明区域被替换为黑色。我怎样才能保持这种透明度?

effect.View = camera.View;
effect.Projection = camera.Projection;
effect.World = Matrix.CreateBillboard(pos, camera.Pos, camera.Up, camera.Dir);
effect.Texture = texture;


foreach (EffectPass pass in effect.CurrentTechnique.Passes)
{
    pass.Apply();
    g.DrawUserPrimitives(PrimitiveType.TriangleStrip, verts, 0, 2);
}

以下是我设置顶点的代码:

float s = 0.25f; ; // initial size of a particle

verts[0].Position = new Vector3(-s, -s, 0);
verts[1].Position = new Vector3(+s, -s, 0);
verts[2].Position = new Vector3(-s, +s, 0);
verts[3].Position = new Vector3(+s, +s, 0);

verts[0].TextureCoordinate = new Vector2(0, 0);
verts[1].TextureCoordinate = new Vector2(1, 0);
verts[2].TextureCoordinate = new Vector2(0, 1);
verts[3].TextureCoordinate = new Vector2(1, 1);

verts[0].Color = Color.White;
verts[1].Color = Color.White;
verts[2].Color = Color.White;
verts[3].Color = Color.White;

希望有人可以帮助我。感谢。


编辑:加载图片的代码::

smokeParticle = Content.Load<Texture2D>("particle_smoke");

1 个答案:

答案 0 :(得分:0)

您确定,纹理图像是否正确加载?你没有在加载图像的地方发布代码,所以我只能推测。但根据我的经验,加载图片通常会出错,并且加载API中可能会发生一些不需要的转换。

您可以使用调试器,并查看纹理是否具有支持透明度的像素类型。如果没有,您可以确定错误是在加载代码期间(假设您的PNG具有透明度)。

[编辑]

Blend State将是我的第二个猜测。很好,你自己找到了。

对于你的第二个问题:alpha-blending需要将对象拉回到前面才能看起来正确,所以在渲染之前你必须做一些空间排序。

但是如果你只有完全/没有不透明度,你可以跳过排序,因为它总是看起来正确。但是你必须注意,完全透明的部分不会覆盖z缓冲区,并隐藏稍后渲染的粒子。

Here是关于不同选项的好文章。它是用C语言编写的openGL,但我相信你可以把它翻译成C#/ XNA。