XNA Alpha Blending, чтобы сделать текстуру прозрачной - PullRequest
8 голосов
/ 17 апреля 2010

Я пытаюсь использовать альфа-смешение в XNA, чтобы сделать часть нарисованной текстуры прозрачной. Например, я очищаю экран до какого-то цвета, скажем, синего. Затем я рисую текстуру красного цвета. Наконец, я рисую текстуру, которая представляет собой радиальный градиент от полностью прозрачного в центре до полностью черного на краю. Я хочу, чтобы красная текстура, нарисованная ранее, была прозрачной в тех же местах, что и текстура с радиальным градиентом. Таким образом, вы должны видеть синий фон сквозь красную текстуру.

Я думал, что это сработает.

GraphicsDevice.Clear(Color.CornflowerBlue);

spriteBatch.Begin(SpriteBlendMode.None);
spriteBatch.Draw(bg, new Vector2(0, 0), Color.White);
spriteBatch.End();

spriteBatch.Begin(SpriteBlendMode.None);

GraphicsDevice.RenderState.AlphaBlendEnable = true;
GraphicsDevice.RenderState.AlphaSourceBlend = Blend.One;
GraphicsDevice.RenderState.AlphaDestinationBlend = Blend.Zero;
GraphicsDevice.RenderState.SourceBlend = Blend.Zero;
GraphicsDevice.RenderState.DestinationBlend = Blend.One;
GraphicsDevice.RenderState.BlendFunction = BlendFunction.Add;

spriteBatch.Draw(circle, new Vector2(0, 0), Color.White);
spriteBatch.End();

GraphicsDevice.RenderState.AlphaBlendEnable = false;

Но похоже, что все мои настройки RenderState игнорируются. Я также попытался установить SpriteBlendMode в AlphaBlend. Он смешивает текстуры, но это не тот эффект, который мне нужен.

Любая помощь будет оценена.

1 Ответ

6 голосов
/ 19 апреля 2010

Вы пытаетесь маскировать альфа-канал. Самый простой способ - запечь альфа-канал, используя конвейер контента.Но если по какой-то причине вы хотите сделать это во время выполнения, вот как (грубо) используя цель рендеринга (лучшее и более быстрое решение - написать шейдер)

Сначала создайте RenderTarget2D для хранения и промежуточной маскированной текстуры

RenderTarget2D maskRenderTarget = GfxComponent.CreateRenderTarget(GraphicsDevice,
    1, SurfaceFormat.Single);

Установить renderTarget и состояние устройства

GraphicsDevice.SetRenderTarget(0, maskRenderTarget);
GraphicsDevice.RenderState.AlphaBlendEnable = true;
GraphicsDevice.RenderState.DestinationBlend = Blend.Zero;
GraphicsDevice.RenderState.SourceBlend = Blend.One;

Установить каналы для записи в каналы R, G, B и нарисовать первую текстуру, используя пакет спрайтов

GraphicsDevice.RenderState.ColorWriteChannels = ColorWriteChannels.Red  | ColorWriteChannels.Green | ColorWriteChannels.Blue;
spriteBatch.Draw(bg, new Vector2(0, 0), Color.White);

Установите каналы только в альфа-канал и нарисуйте альфа-маску

GraphicsDevice.RenderState.ColorWriteChannels = ColorWriteChannels.Alpha;
spriteBatch.Draw(circle, new Vector2(0, 0), Color.White);

Теперь вы можете восстановить цель рендеринга в обратном буфере и нарисовать текстуру, используя альфа-смешение.*

Также не забудьте восстановить состояние:

GraphicsDevice.RenderState.ColorWriteChannels = ColorWriteChannels.All;
...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...