Bild mit additivem Blending zeichnen

8

Die Frage wurde beantwortet. Weitere Informationen finden Sie in EDIT # 4 am Ende dieses Textes.

Wir arbeiten gerade an einer Spielemachine, die ziemlich gut läuft. Ich arbeite am Animation Creator und frage mich, ob es möglich ist, ein Bild mit additivem Mischen zu zeichnen.

Lass es mich erklären.

Wir verwenden die System.Drawing-Bibliothek von C # und arbeiten mit Windows Forms. Vorerst kann der Benutzer seine Animation erstellen, indem er ein gerahmtes Animationsbild (ein Bild, das jeden Frame der Animation enthält) importiert und der Benutzer kann diese Frames ziehen und ablegen, wo immer er will.

Das eigentliche Problem ist, dass wir nicht herausfinden können, wie man mit der additiven Mischung einen Rahmen zeichnet.

Hier ist ein Beispiel dafür, was Additive Blending ist, wenn Sie es nicht ganz verstehen. Ich werde dir nicht die Schuld geben, ich habe es schwer, auf Englisch zu schreiben.

Wir verwenden die folgende Methode, um auf einem Panel oder direkt auf dem Formular zu zeichnen. Zum Beispiel ist hier der Code zum Zeichnen einer gekachelten Karte für den Karteneditor. Da der Code von AnimationManager ein Chaos ist, wird es mit diesem Beispiel klarer.

%Vor%

Gibt es eine Möglichkeit, ein Bild mit einer additiven Zeichnung zu zeichnen, und wenn dem so wäre, wäre ich für immer dankbar, wenn mir jemand zeigen könnte, wie. Danke.

EDIT # 1:

Für das Zeichnen von Bildern verwenden wir eine Farbmatrix, um Farbton und Alph (Deckkraft) wie folgt einzustellen:

%Vor%

Vielleicht kann die Farbmatrix zum additiven Mischen verwendet werden?

BEARBEITEN # 2:

Gerade gefunden dieser Artikel von Mahesh Chand.

Nach einem weiteren Browsing ist es mit einer Farbmatrix vielleicht nicht möglich, obwohl es viel in Bezug auf Farbtransformationen leisten kann. Ich werde meine eigene Frage beantworten, wenn die Lösung gefunden wird.

Danke für Ihre Hilfe.

EDIT # 3:

XNA hat eine Menge Dokumentation hier zum Thema Mischen. Ich fand die Formel, die verwendet wurde, um eine additive Mischung für jedes Pixel eines Bildes zu erreichen.

PixelColor = (Quelle * [1, 1, 1, 1]) + (Ziel * [1, 1, 1, 1])

Vielleicht gibt es eine Möglichkeit, diese Formel im aktuellen Kontext zu verwenden? Ich werde beim nächsten Schnitt 50 Bounty starten, wir brauchen das wirklich.

Nochmals vielen Dank für Ihre Zeit.

BEARBEITEN SIE # 4

Dank Axon ist jetzt das Problem gelöst. Mit XNA und seinem Spritebatch können Sie die additive Mischung so durchführen:

Zuerst erstellen Sie ein GraphicsDevice und ein SpriteBatch

%Vor%

Wenn es Zeit ist, auf das Steuerelement oder das Formular (z. B. mit dem OnPaint-Ereignis) zu zeichnen, können Sie den folgenden Codeblock verwenden

%Vor%     
Érik Desjardins 29.08.2012, 04:29
quelle

1 Antwort

7

Verwenden Sie entweder 1) XNA (empfohlen für Geschwindigkeit) oder 2) Pixel-Operationen in C #. Es kann andere Methoden geben, aber beide funktionieren (ich benutze jeden davon für 3D-Effekte und Bildanalyse-Apps, die ich pflege).

Pixeloperationen in C #: Verwenden von 3 Bitmaps; bmpA, bmpB, bmpC, wo Sie bmpA + bmpB in bmpC speichern möchten.

%Vor%

Der obige Code ist sehr langsam. Eine schnellere Lösung in C # könnte Zeiger wie folgt verwenden:

%Vor%

Die obige Methode benötigt Zeiger und muss daher mit der Direktive "unsafe" kompiliert werden. Nehmen Sie außerdem 1 Byte für R, G und B an. Ändern Sie den Code entsprechend Ihrem Pixelformat.

Die Verwendung von XNA ist viel schneller (Leistung), da es hardwarebeschleunigt ist (von der GPU). Es besteht im Wesentlichen aus Folgendem: 1. Erstellen Sie die Geometrie, die zum Zeichnen des Bildes benötigt wird (ein Rechteck, höchstwahrscheinlich ein Vollbild-Quad). 2. Schreibe einen Vertex-Shader und Pixel-Shader. Der Vertex-Shader kann die Geometrie einfach unverändert passieren. Oder Sie können eine orthogonale Projektion anwenden (abhängig davon, mit welchen Koordinaten Sie für das Quad arbeiten möchten). Der Pixelshader wird die folgenden Zeilen (HLSL) haben:

%Vor%

Für den Zugriff auf Texturen stehen verschiedene Methoden zur Verfügung. Das Folgende funktioniert auch (abhängig davon, wie der XNA-Code an die Shader-Parameter gebunden werden soll):

%Vor%

Welcher der oben genannten Shader verwendet wird, hängt davon ab, ob Sie die HLSL-Schnittstellen "sampler2D" oder "texture" für den Zugriff auf die Texturen verwenden möchten.

Sie sollten auch darauf achten, eine geeignete Sampler-Einstellung zu verwenden, um sicherzustellen, dass keine Samples (zB lineare Interpolation) beim Suchen von Farbwerten verwendet werden, es sei denn, Sie möchten etwas Höherwertiges / Höheres verwenden. .

XNA verfügt außerdem über integrierte BlendStates, mit denen Sie angeben können, wie überlappende Texturen kombiniert werden sollen. I.e. BlendState.Additive (siehe aktualisierten Originalbeitrag).

    
axon 31.08.2012, 06:52
quelle