Ich hatte gerade eine Idee für mein laufendes Spiel, das mit opengl in c ++ erstellt wurde: Ich möchte einen großen Umriss (5-6 Pixel) auf mehreren überlappenden Objekten haben, wenn der Spieler etwas gewinnt.
Ich dachte, der beste Weg ist, Schablonenpuffer zu verwenden, aber es sind einige Stunden, in denen ich versuche, den Schablonenpuffer außerhalb des Bildschirms zu rendern, und ich kann kein so wahrscheinliches Ergebnis erzielen. Es gibt einige andere Techniken!
Das möchte ich bekommen:
Irgendwelche Ideen?
Antworten:
Hier ist der Code, der von einem WebGL-Schablonencode angepasst wurde, an dem ich arbeite:
Ich glaube, ich habe diesen Ansatz in RTS-Spielen verwendet, um Halos um ausgewählte Einheiten zu zeichnen, aber es ist lange her und ich kann mich nicht erinnern, ob es Fallstricke und alle Nuancen gibt.
quelle
Suchen Sie zunächst alle Objektgruppen, wobei eine Objektgruppe eine Sammlung von Objekten ist, die sich überlappen. Die Standardkollisionserkennung sollte den Job erledigen. Weisen Sie jeder Gruppe eine eindeutige Farbe zu. Jede Farbe würde reichen.
Rendern Sie alle Ihre Objekte als Volltonfarben mithilfe der Gruppenfarbe zu einer Textur.
Erstellen Sie eine neue Gliederungstextur mit denselben Abmessungen wie das Renderziel. Durchsuchen Sie jedes Texel des Renderziels und stellen Sie fest, ob es eine andere Farbe als die umgebenden Texel hat. Wenn dies der Fall ist, ändern Sie das entsprechende Texel in der Gliederungstextur in die gewünschte Linienfarbe.
Nehmen Sie abschließend diese Gliederungstextur und rendern Sie sie über das Bild, das Sie auf dem Bildschirm zeichnen möchten (Sie können dies natürlich gleichzeitig mit der Kantenerkennung in einem Fragment-Shader tun und vermeiden, die Kantenstruktur im ersten zu erstellen Platz).
Wenn Sie diesen Schritt auf der CPU ausführen, indem Sie eine for-Schleife verwenden, um die Texel des Rendering-Ziels zu durchlaufen, ist dies ziemlich langsam, aber wahrscheinlich gut genug, um es zu testen und in einigen Fällen sogar zu verwenden. Um dies in Echtzeit zu verwenden, sollten Sie dies am besten in einem Shader erledigen.
Ein Fragment-Shader für diese Kantenerkennung könnte folgendermaßen aussehen.
Wobei der zweite Wert in der textur2D-Suche eine 2D-Koordinate relativ zu v_texCoord ist. Sie würden dies anwenden, indem Sie das erste Renderziel als Textur auf einem Vollbild-Quad rendern. Dies ähnelt dem Anwenden von Unschärfeeffekten im Vollbildmodus, z. B. einer Guassian-Unschärfe.
Der Grund für die Verwendung des ersten Renderziels mit Volltonfarben besteht einfach darin, sicherzustellen, dass zwischen verschiedenen überlappenden Objekten keine Kante wahrgenommen wird. Wenn Sie einfach eine Kantenerkennung auf dem Bildschirmbild durchführen, werden Sie wahrscheinlich feststellen, dass es auch Kanten an den Überlappungen erkennt (vorausgesetzt, die Objekte haben unterschiedliche Farben / Texturen / Beleuchtung).
quelle