XNA Alpha Blending, чтобы сделать текстуру прозрачной
Я пытаюсь использовать альфа-смешение в XNA, чтобы сделать часть нарисованной текстуры прозрачной. Так, например, я очищаю экран до некоторого цвета, скажем, Blue. Затем я рисую текстуру красного цвета. Наконец, я рисую текстуру, которая представляет собой просто радиальный градиент от полностью прозрачного в центре до полностью черного на краю. Я хочу, чтобы красная текстура, нарисованная ранее, была прозрачной в тех же местах, что и текстура с радиальным градиентом. Таким образом, вы должны увидеть синий фон сквозь красную текстуру.
Я думал, что это будет работать.
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 ответ
Вы пытаетесь маскировать альфа-канал. Самый простой способ - запечь альфа-канал, используя конвейер контента. Но если по какой-то причине вы хотите сделать это во время выполнения, вот как (примерно) использовать цель рендеринга (лучшее и более быстрое решение - написать шейдер)
Сначала создайте 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;
...