C# 在XNA中绘制纹理图元时,如何保持/保留PNG透明度?

C# 在XNA中绘制纹理图元时,如何保持/保留PNG透明度?,c#,xna,textures,transparency,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

我创建了一个粒子系统,它可以绘制许多基本体并向它们添加纹理。源精灵是一个具有透明度的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");

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

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

[编辑]

混合状态可能是我的第二个猜测。很高兴你自己发现了

关于第二个问题:alpha混合要求将对象向后绘制到前面,以便看起来正确,因此在渲染之前必须进行一些空间排序

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


这是一篇关于不同选项的好文章。它是用C为openGL编写的,但我相信您可以将其转换为C/XNA。

感谢您的回复。图像作为纹理2D加载。我编辑了原始帖子以显示其代码。您的答案的第一部分可能是批评或要求作者澄清的边缘,请在其帖子下方留下评论。我会的,但我需要越过50分的障碍才能真正发表评论。