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