Альфа XNA, Смешивающаяся для создания часть структуры прозрачной

То, что я пытаюсь сделать, использовать альфу, смешивающую 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. Это смешивает структуры, но это не эффект, который я хочу.

Любая справка ценилась бы.

8
задан DangerMouse 17 April 2010 в 01:09
поделиться

1 ответ

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

Сначала создайте 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);

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

maskedTexture = shadowRenderTarget.GetTexture();
...

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

GraphicsDevice.RenderState.ColorWriteChannels = ColorWriteChannels.All;
...
6
ответ дан 5 December 2019 в 22:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: