Нанесение изображения с аддитивным смешиванием

Question was answered. For more information, check out EDIT #4 at the end of this text.

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

Позволь мне объяснить.

Мы используем библиотеку System.Drawing C # и работаем с Windows Forms. На данный момент пользователь может создать свою анимацию, импортировав изображение анимации в рамке (изображение, содержащее каждый кадр анимации), и пользователь может перетаскивать эти кадры куда угодно.

Фактическая проблема заключается в том, что мы не можем понять, как нарисовать рамку с аддитивным смешиванием.

Вот пример того, что такое аддитивное смешивание, если вы его не совсем поняли. Я вас не виню, мне трудно писать по-английски. Additive blending exemple

Мы используем следующий метод для рисования на панели или непосредственно в форме. Например, вот код для рисования мозаичной карты для редактора карт. Поскольку код AnimationManager является беспорядком, с этим примером будет понятнее.

        using (Graphics g = Graphics.FromImage(MapBuffer as Image))
        using (Brush brush = new SolidBrush(Color.White))
        using (Pen pen = new Pen(Color.FromArgb(255, 0, 0, 0), 1))
        {
            g.FillRectangle(brush, new Rectangle(new Point(0, 0), new Size(CurrentMap.MapSize.Width * TileSize, CurrentMap.MapSize.Height * TileSize)));

            Tile tile = CurrentMap.Tiles[l, x, y];
            if (tile.Background != null) g.DrawImage(tile.Background, new Point(tile.X * TileSize, tile.Y * TileSize));

            g.DrawRectangle(pen, x * TileSize, y * TileSize, TileSize, TileSize);
        }

Возможен ли способ рисования изображения с помощью аддитивного рисунка, и если да, то я буду всегда благодарен, если кто-то может указать мне, как это сделать. Спасибо.

EDIT #1 :

Для рисования изображений мы используем цветовую матрицу для установки оттенка и альфа-канала (непрозрачность) следующим образом:

ColorMatrix matrix = new ColorMatrix
(
    new Single[][]  
    { 
        new Single[] {r, 0, 0, 0, 0},
        new Single[] {0, g, 0, 0, 0},
        new Single[] {0, 0, b, 0, 0},
        new Single[] {0, 0, 0, a, 0},
        new Single[] {0, 0, 0, 0, 1}
    }
);

Может быть, цветовая матрица может быть использована для смешивания добавок?

EDIT #2 :

Только что нашелэтот статья Махеш Чанд.

После дальнейшего просмотра, это может быть невозможно с цветовой матрицей, даже несмотря на то, что она может многое сделать в отношении цветовых преобразований. Я отвечу на свой вопрос, если найдется решение.

Спасибо за помощь.

EDIT #3 :

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

PixelColor = (источник * [1, 1, 1, 1]) + (пункт назначения * [1, 1, 1, 1])

Может быть, есть способ использовать эту формулу в текущем контексте? Я начну вознаграждение за 50 при следующем редактировании, нам действительно нужно, чтобы это работало.

Еще раз спасибо за ваше время.

EDIT #4

Благодаря аксону, теперь проблема решена. Используя XNA и его Spritebatch, вы можете выполнить аддитивное смешивание следующим образом:

Прежде всего вы создаете GraphicsDevice и SpriteBatch

// In the following example, we want to draw inside a Panel called PN_Canvas. 
// If you want to draw directly on the form, simply use "this" if you
// write the following code in your form class

PresentationParameters pp = new PresentationParameters();

// Replace PN_Canvas with the control to be drawn on
pp.BackBufferHeight = PN_Canvas.Height;
pp.BackBufferWidth = PN_Canvas.Width;
pp.DeviceWindowHandle = PN_Canvas.Handle;
pp.IsFullScreen = false;

device = new GraphicsDevice(GraphicsAdapter.DefaultAdapter, GraphicsProfile.Reach, pp);
batch = new SpriteBatch(device);

Затем, когда пришло время рисовать на элементе управления или в форме (например, с событием OnPaint), вы можете использовать следующий блок кода

// You should always clear the GraphicsDevice first
device.Clear(Microsoft.Xna.Framework.Color.Black);

// Note the last parameter of Begin method
batch.Begin(SpriteSortMode.BackToFront, BlendState.Additive);
batch.draw( /* Things you want to draw, positions and other infos */ );
batch.End();

// The Present method will draw buffer onto control or form
device.Present();

Ответы на вопрос(1)

Ваш ответ на вопрос