Obraz rysunkowy z mieszaniem addytywnym

Odpowiedzi na pytanie. Więcej informacji można znaleźć w EDIT # 4 na końcu tego tekstu.

Pracujemy obecnie nad silnikiem gamemaking, który idzie całkiem dobrze. Pracuję nad twórcą animacji i zastanawiałem się, czy możliwe jest narysowanie obrazu z mieszaniem addytywnym.

Pozwól mi wyjaśnić.

Używamy biblioteki System.Drawing C # i pracujemy z Windows Forms. Na razie użytkownik jest w stanie stworzyć swoją animację, importując obraz animowany w ramce (obraz zawierający każdą klatkę animacji), a użytkownik może przeciągać i upuszczać te ramki w dowolne miejsce.

Rzeczywisty problem polega na tym, że nie możemy dowiedzieć się, jak narysować ramkę z dodatkiem mieszania.

Oto przykład tego, czym jest mieszanie addytywne, jeśli go nie rozumiesz. Nie obwiniam cię, ciężko mi pisać po angielsku.

Używamy następującej metody do rysowania na panelu lub bezpośrednio na formularzu. Na przykład kod do rysowania kafelkowej mapy dla edytora map. Ponieważ kod AnimationManager jest bałaganem, będzie to wyraźniejsze z tym przykładem.

        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);
        }

Czy jest możliwy sposób rysowania obrazu z addytywnym rysunkiem, a jeśli tak, byłbym na zawsze wdzięczny, gdyby ktoś mógł mi wskazać, jak to zrobić. Dziękuję Ci.

EDYCJA # 1:

Do rysowania obrazów używamy macierzy kolorów, aby ustawić odcień i alf (krycie) w ten sposób:

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}
    }
);

Może macierz kolorów można wykorzystać do mieszania addytywnego?

EDYCJA # 2:

Właśnie znalazłemto artykuł Mahesh Chand.

Po dalszym przeglądaniu może nie być możliwe w przypadku macierzy kolorów, nawet jeśli może ona wiele osiągnąć w zakresie transformacji kolorów. Odpowiem na moje pytanie, jeśli znalezione zostanie rozwiązanie.

Dziękuję ci za pomoc.

EDYCJA # 3:

XNA ma dużo dokumentacjitutaj o mieszaniu. Znalazłem formułę używaną do uzyskania addytywnego mieszania na każdym pikselu obrazu.

PixelColor = (źródło * [1, 1, 1, 1]) + (miejsce docelowe * [1, 1, 1, 1])

Może istnieje sposób na wykorzystanie tej formuły w obecnym kontekście? Zacznę 50 nagród w następnej edycji, naprawdę potrzebujemy tego do pracy.

Jeszcze raz dziękuję za poświęcony czas.

EDYCJA # 4

Dzięki aksonowi problem został rozwiązany. Korzystając z XNA i jego Spritebatch, możesz osiągnąć mieszanie addytywne, wykonując następujące czynności:

Przede wszystkim tworzysz GraphicsDevice i 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);

Następnie, gdy nadejdzie pora na narysowanie formantu lub formularza (na przykład za pomocą zdarzenia OnPaint), możesz użyć następującego bloku kodu

// 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();

questionAnswers(1)

yourAnswerToTheQuestion