¿Cómo hago la transparencia alfa correctamente en XNA 4.0?

14

Bien, he leído varios artículos, tutoriales y preguntas sobre esto. La mayoría apunta a la misma técnica que no resuelve mi problema. Necesito la capacidad de crear sprites semitransparentes (en realidad, texture2D) y hacer que superpongan otro sprite.

Puedo lograr eso con las muestras de código que he encontrado, pero no estoy satisfecho con los resultados y sé que hay una manera de hacerlo. En la programación móvil (BREW) lo hicimos de la vieja escuela y en realidad verificamos la transparencia de cada píxel antes de renderizar.

En este caso, parece hacer que el sprite debajo de él se mezcle con el alfa encima. Esto puede ser un artefacto de cómo renderizo la textura pero, como dije antes, todos los ejemplos apuntan a esta técnica. Antes de continuar, seguiré adelante y pegaré mi código de ejemplo.

    public void Draw(SpriteBatch batch, Camera camera, float alpha)
    {
        int tileMapWidth = Width;
        int tileMapHeight = Height;

        batch.Begin(SpriteSortMode.Texture,
            BlendState.AlphaBlend,
            SamplerState.PointWrap,
            DepthStencilState.Default,
            RasterizerState.CullNone,
            null, camera.TransformMatrix);

        for (int x = 0; x < tileMapWidth; x++)
        {
            for (int y = 0; y < tileMapHeight; y++)
            {
                int tileIndex = _map[y, x];

                if (tileIndex != -1)
                {
                    Texture2D texture = _tileTextures[tileIndex];

                    batch.Draw(
                        texture,
                        new Rectangle(
                            (x * Engine.TileWidth),
                            (y * Engine.TileHeight),
                            Engine.TileWidth,
                            Engine.TileHeight),
                        new Color(new Vector4(1f, 1f, 1f, alpha )));
                }
            }
        }

        batch.End();

    }

Como puede ver, en este código estoy usando el método SpriteBatch.Begin sobrecargado que toma, entre otras cosas, un estado de mezcla. Estoy casi seguro de que ese es mi problema. No quiero MEZCLAR los sprites, quiero que sean transparentes cuando alpha sea 0. En este ejemplo, puedo establecer alpha en 0 pero aún muestra ambos mosaicos, con el sprite ordenado en z más bajo, descolorido debido a que mezcla. Este no es un efecto deseado, quiero que el sprite ordenado en z más alto se desvanezca y no afecte el color debajo de él de tal manera.

Podría estar muy lejos aquí, ya que soy bastante nuevo en el desarrollo de XNA, así que siéntase libre de guiarme en la dirección correcta en caso de que vaya por el hoyo de conejo equivocado.

TIA

Soshimo
fuente
¿Por qué es alfa 'apropiado'? Hay soporte alfa y no hay soporte alfa, ¿verdad?
El pato comunista el
Debería poder editar el título presionando 'editar' y luego el título debería estar en la parte superior. A menos que algo haya cambiado.
El pato comunista el

Respuestas:

18

Si sigo el problema correctamente, intente llamar a Begin with BlendState.NonPremultiplied. Este artículo también puede ayudar a arrojar algo de luz sobre cómo funciona la mezcla alfa en XNA:

https://web.archive.org/web/20130208130323/http://blogs.msdn.com/b/shawnhar/archive/2010/04/08/premultiplied-alpha-in-xna-game-studio-4- 0.aspx

Alex Schearer
fuente
Sí, parece que el NonPremultiplied va a hacer el truco (al menos de acuerdo con el enlace que publicaste). Voy a esperar y ver si funciona cuando llegue a casa esta noche antes de aceptar, pero parece que esta es la respuesta. ¡Gracias!
Soshimo
Ese fue el truco. No me di cuenta de que cambiaron eso en 4.0. Ese artículo que vinculó fue muy ilustrativo. Gracias.
Soshimo
1
+1 Gracias! Solo buscaba en línea tratando de descubrir por qué el alfa solo funcionaba parcialmente. Esto lo resolvió. Los términos que estaba usando en google eran Spritebatch Opacity, espero que esos términos ahora ayuden a los gogglers a encontrar esta respuesta.
AttackingHobo