Intersección de color de dos sprites alfa-blended

En XNA, ¿es posible fusionar dos sprites mezclados alfa para que se vean como una forma contigua, eliminando la fusión de color en la superposition? En el momento en que lo bash, la intersección es bastante visible:

dos círculos con superposición

Me gustaría que se pareciera más a esta maqueta:

dos círculos fusionados

Este es el código de dibujo para este ejemplo, pero es similar a lo que se está usando en el juego actual:

protected override void Draw(GameTime gameTime) { GraphicsDevice.Clear(Color.Black); spriteBatch.Begin(SpriteSortMode.FrontToBack, null, SamplerState.PointClamp, null, null); for (int x = 10; x <= 1000; x += 10) for (int y = 10; y <= 1000; y += 10) spriteBatch.Draw(Content.Load<Texture2D>("dot"), new Vector2(x, y), null, Color.Gray, 0, Vector2.Zero, 1, SpriteEffects.None, 0.1f); spriteBatch.Draw(Content.Load<Texture2D>("circle"), new Vector2(200, 200), null, Color.FromNonPremultiplied(255, 255, 255, 50), 0, Vector2.Zero, 1, SpriteEffects.None, 0.5f); spriteBatch.Draw(Content.Load<Texture2D>("circle"), new Vector2(300, 200), null, Color.FromNonPremultiplied(255, 255, 255, 50), 0, Vector2.Zero, 1, SpriteEffects.None, 0.5f); spriteBatch.End(); base.Draw(gameTime); } 

Sospecho que la respuesta es de alguna manera combinar las texturas antes de pasarlas al spritebatch para ser sorteadas, pero preferiría evitar eso si es posible.

¡Gracias por cualquier ayuda!

Puede intentar dibujar una textura en la memory sin alfa y luego dibuja el resultado con el valor deseado de alfa.

Este enlace le dice cómo dibujar la memory de textura: http://www.riemers.net/eng/Tutorials/XNA/Csharp/Series3/Render_to_texture.php

Aquí es cuando rompería el buffer de la plantilla . Es como el buffer de profundidad en que es una máscara por píxel que puedes explotar para varios efectos. Su escenario particular es excepcionalmente adecuado para su uso.

Al crear su GraphicsDeviceManager, puede configurar el formatting de galería de símbolos de profundidad para solicitar un formatting con una cierta cantidad de bits asignados para las operaciones de galería de símbolos. Una vez que tienes eso, el process de renderizado es, en un nivel alto, esto:

  1. Habilite la testing del stencil y borre el buffer del stencil a todos 0.
  2. Configure la testing de galería de símbolos para que solo acepte nuevos píxeles donde los valores de galería de símbolos sean 0 Y para incrementar el valor de la memory de la galería de símbolos cuando se acepte un nuevo píxel.
  3. Dibuja todas las forms que quieras enmascarar de esta manera.
  4. Deshabilitar la testing del stencil.

Lo que hace esto es evitar que dibujes al mismo píxel dos veces porque el buffer de la plantilla fallará.

No tengo el código a mano, pero esta respuesta parece ser una muestra decente y rápida del uso del buffer de la plantilla. El otro buen recurso para esto será la documentation de DepthStencilState , que expone todas las opciones para las testings de esténciles.

Ahora hay algunos problemas que popupán con los sprites transparentes, ya que los píxeles transparentes seguirán pasando por la testing del stencil (por lo tanto, tu plantilla realmente será un rectángulo, no el círculo que ves). El código de ejemplo que he vinculado utiliza un efecto de testing alfa que debería solucionarlo descartando cualquier píxel transparente, aunque yo mismo no lo haya probado.