Problem z przezroczystością generowanej tekstury w RenderTarget2D

0

Witam.

Piszę gierkę w XNA typu obrona wieży. Chciałem by ścieżka była budowana w inny sposób niż z nudnych gotowych kafelków. Wymyśliłem więc, że będę posługiwał się czymś w rodzaju tekstury pędzla, który na obiekcie typu RenderTarget2D narysuje mi piksele, z których potem chciałem brać tylko informację o ich widoczności (kanale alpha).
Tak wygląda tekstura pędzla (zapisana w PNG):
user image
Ścieżkę chcę tworzyć mniej więcej w ten sposób:

Texture2D ground;
RenderTarget2D path;
Texture2D pathBrush;


//Tutaj w sekcji LoadContent
GraphicsDevice.SetRenderTarget(path);

spriteBatch.Begin(SpriteSortMode.Immediate, BlendState.AlphaBlend, SamplerState.PointClamp, null, null);
GraphicsDevice.Clear(Color.Transparent);
for (int i = 0; i < 15; i++)
{
       spriteBatch.Draw(pathBrush, new Rectangle(i * 10, 50, 39, 39), new Rectangle(0, 0, 39, 39), Color.White, random.Next(), new Vector2(20, 20), SpriteEffects.None, 0.0f);
       spriteBatch.Draw(pathBrush, new Rectangle(i * 10, random.Next(-7, 7) + 50, 59, 59), new Rectangle(0, 0, 39, 39), Color.White, random.Next(), new Vector2(20, 20), SpriteEffects.None, 0.0f);
}

spriteBatch.End();
GraphicsDevice.SetRenderTarget(null);
GraphicsDevice.Clear(Color.Transparent);

Potem gdy korzystam z path jako tekstury w metodzie Draw wszystko wydaje się być ok.
user image

Problem pojawia się gdy chcę ten czarny kształt wypełnić kolorami tekstury.

Color[,] pathColor = TextureTo2DArray(path);
Color[,] groundColors = TextureTo2DArray(ground);
Color[] data = new Color[pathColor.GetLength(0) * pathColor.GetLength(1)];

for (int x = 0; x < pathColor.GetLength(0); x++)
{
        for (int y = 0; y < pathColor.GetLength(1); y++)
        {
                    data[x + y * pathColor.GetLength(0)] = groundColors[x%groundColors.GetLength(0), y%groundColors.GetLength(1)];
                    data[x + y * pathColor.GetLength(0)].A = pathColor[x, y].A;
                    if (pathColor[x, y].A == 0)
                    {
                        data[x + y * pathColor.GetLength(0)] = Color.Transparent;
                    }
         }
}

path.SetData(data);

Wówczas efekt jest następujący (osiągnięty po lewej, zamierzony po prawej):
user image

Czytałem o tym całym alpha belndingu, kombinowałem ale nic nie udało mi się zdziałać. Nie wiem gdzie może leżeć przyczyna.
Jakieś pomysły?

2

Wydaje mi się, że potrzebujesz czegoś takiego: http://msdn.microsoft.com/en-us/library/bb197345%28v=xnagamestudio.10%29.aspx
Tutaj rysowanie: http://msdn.microsoft.com/en-us/library/bb203867%28v=xnagamestudio.10%29.aspx

W OpenGL kiedyś robiłem maskowanie poprzez wyświetlanie dwóćh QUADów, jeden na drugim. Ustawiasz blending zgodnie z pożądanym efektem ( http://zanir.wz.cz/programming/opengl/img/011_blending.jpg ) i jazda ;) W XNA Ci nie pomogę, ale powyższe linki powinny.

0

Rozwiązanie z dwoma oddzielnymi SpriteBatch'ami częściowo rozwiązało problem. Dodatkowo funkcję Begin odpaliłem z argumentami SpriteSortMode.Immediate i BlendState.NonPremultiplied i wszystko śmiga :)
Dzięki śliczne za pomoc :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1