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
Respuestas:
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
fuente
Totalmente de acuerdo con la respuesta de Alex, aunque si te quedas con el alfa premultiplicado, creo que también podrías hacerlo de esta manera
Shawn también hizo una publicación explicando la diferencia entre alfa premultiplicado y no multiplicado - http://blogs.msdn.com/b/shawnhar/archive/2009/11/06/premultiplied-alpha.aspx
fuente