2012-10-18 12 views
5

Ich habe 2d Zeichenkunst, die zu einem Box2d Skelett gemappt werden. Der Arm des Charakters kann zum Beispiel 2 physikalische Rechtecke sein, die mit einem Gelenk am Ellenbogen verbunden sind. Jedes Rechteck hat sein eigenes entsprechendes Sprite. Die Kunst für den Unterarm wird nicht vollständig rechteckig sein. Es kann eine rechteckige Png-Quelle sein, aber es wird eine Menge negativen Raum geben, wo der Arm nicht notwendigerweise gezeichnet wird.Wie man 2d Kunst in Dreiecke unter Verwendung OpenGL zerlegt

Meine Frage ist, was ist der beste Weg, um die 2D-Kunst in Dreiecke aufzubrechen? Sollte ich alle flachen Sprites als einfaches Rechteck behandeln, das aus zwei Dreiecken besteht und viel Alpha-Raum übrig lässt? Oder ist es am besten, die Form in mehrere Dreiecke zu zerlegen und zu versuchen, die tatsächliche Form (möglicherweise mit einem Dreiecksfächer) anzupassen? Was könnten einige der Vorteile/Nachteile jedes Ansatzes sein? Ich werde die Texturen aktualisieren, wenn dem Charakter verschiedene Dinge passieren.

Hier ist ein Beispiel dafür, was ich spreche:

img

(das rote Quadrat ist die Physik Form, und die blauen Linien sind möglich Dreieck Konfigurationen)

Antwort

1

Weniger Geometrie ist in der Regel besser für die Leistung (3. von links).

Die "exakte" Triangulation (4. von links) wäre nützlich für die Kollisionserkennung mit hoher Genauigkeit (Laser, die von einem glänzenden Asteroiden reflektiert werden?).

Seien Sie vorsichtig mit häufigen Texturaktualisierungen. glTexSubImage2d() ist der Weg zu gehen.

Wenn Ihre GL-Implementierung dies unterstützt, können Sie asynchrone Uploads durchführen using PBOs.

+0

Danke. Ich denke nicht über die tatsächlichen Kunstformen für die Kollisionserkennung nach. Das wird wahrscheinlich alles mit dem Physikmodell geschehen. Ich nehme an, ich frage mich, ob all dieser extra gerenderte Alpha-Raum den Vorteil der Einfachheit der 2-Dreieck-Lösung beseitigen würde ... besonders wenn Texturen weniger rechteckig werden und negativer Raum verwendet wird . Etwas Kreisförmiges, wie eine Meteortür, hätte in der rechteckigen Textur viel negativen Raum. Mehrere dieser Alpha = 0-Bereiche übereinander zu überlagern, hätte negative Auswirkungen, oder? –

+2

Wenn Sie keine tatsächliche Alpha-Mischung benötigen (die aufgrund des hinzugefügten Ziel-Pixel-Lesevorgangs mehr Speicherbandbreite benötigt), können Sie mit [Alphatest] (http://www.opengl.org/wiki/Transparency_Sorting#Alpha_test) fortfahren. , die einfach ein ankommendes Pixel verwirft, wenn der Alpha-Wert unter einem bestimmten Schwellenwert liegt. Tatsächlich denke ich, dass man Blending und Alpha-Tests kombinieren kann, um das Beste aus beiden Welten zu erhalten: Mit einem niedrigen Schwellenwert werden pure-zero-Pixel früh (vor dem Überblenden) aussortiert, während man an den Rändern von Objekten schöne Alpha-Fades machen kann. – genpfault

+0

Großartig ... das macht sehr viel Sinn und ist sehr hilfreich. –