【问题标题】:How to preserve / retain PNG transparency when drawing textured primitives in XNA?在 XNA 中绘制纹理基元时如何保留/保留 PNG 透明度?
【发布时间】:2015-06-26 09:24:19
【问题描述】:

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

【问题讨论】:

    标签: c# xna textures transparency


    【解决方案1】:

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

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

    [编辑]

    Blend State 是我的第二个猜测。很高兴你自己找到了。

    关于您的第二个问题:alpha 混合需要将对象拉回前面才能看起来正确,因此您必须在渲染之前进行一些空间排序。

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

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

    【讨论】:

    • 感谢您的回复。图像作为 Texture2D 加载。我已经编辑了原始帖子以显示它的代码。
    • 你的答案的第一部分可能是边缘要批评或要求作者澄清,请在他们的帖子下方留下评论
    • 当然。我会的,但我需要通过 50 分的障碍才能真正发表评论。
    猜你喜欢
    • 1970-01-01
    • 2014-11-25
    • 2016-12-26
    • 2021-10-03
    • 1970-01-01
    • 1970-01-01
    • 2014-05-20
    • 1970-01-01
    • 2015-02-15
    相关资源
    最近更新 更多