2017-02-21 4 views
1

Ich bin ziemlich neu in OpenGL und versuche das Rad neu zu erfinden (zum Spaß), indem ich meine eigene einfache Spiel-Engine erstelle und nun versuche, ein HUD mit Text zu erstellen. Um dies zu tun, erstelle ich programmatisch Font-Textur-Maps für den Fragment-Shader, um Quadrate zu texturieren, soweit ich weiß, ist das der normale Ansatz?Das Stapeln von teilweise transparenten Font-Texturen wird durch Ändern der Renderreihenfolge unterbrochen.

Diese meist gut funktioniert, wird der Text auf dem Bildschirm mit einem transparenten Hintergrund so dass Sie dahinter zu sehen, was wie erwartet ist (Abb. 1)

Wenn ich dann einen anderen Text Masche in der Umgebung hinzufügen, der erste, aber mit einem höheren z-index (näher an der Kamera), rendert es über den Anfang des vorherigen Textes und Mischungen (richtige Verwendung?) in der erwarteten Weise (Bild 2)

Allerdings, wenn ich dann Vertausche den Z-Index - so dass die erste Saite (die rosa) näher an der Kamera ist (aber die Renderreihenfolge ist unverändert), sehe ich den Effekt in Abb. 3 wo - obwohl der Texthintergrund immer noch transparent ist, scheint er den anderen Text überschrieben zu haben, anstatt sich damit zu vermischen.

Hinweis: Der gleiche Effekt tritt auf, wenn ich die Reihenfolge, in der die zwei Netze wiedergegeben werden, umkehren, außer dass der weiße Text der Täter ist.

Mit anderen Worten, warum mischt es nur korrekt, wenn die Reihenfolge der Z-Indizes mit der Renderreihenfolge übereinstimmt? Meine Hypothese ist, dass, wenn ich versuche, etwas "hinter" einem Quad mit einem teilweise transparenten Hintergrund zu rendern, ich es zuerst rendern muss, sonst wird die Tiefenprüfung die Spitze davon abschneiden. Ist das eine Grundregel des Grafik-Renderings, an die ich mich gewöhnen sollte? Muss ich nur die Stapelreihenfolge verfolgen und sicherstellen, dass die Artikel in der richtigen Reihenfolge gerendert werden?

render order affects blending

Antwort

2

Obwohl Sie in der Lage sein können, durch die transparenten Teile der Textur zu suchen, kann OpenGL nicht. Wenn die Farbe gemischt wird, wird der Tiefenpuffer immer auf einen bestimmten Wert eingestellt, und wenn Sie etwas dahinter darstellen möchten, wird es durch die unsichtbaren Teile beeinträchtigt.

Um dies zu beheben, können Sie die Tiefenprüfung deaktivieren oder die Dreiecke von hinten nach vorne sortieren.

+1

Wenn Sie nicht möchten, dass Text hinter Objekten angezeigt wird, können Sie auch die Tiefenschreibfunktion für die Textgeometrie deaktivieren, aber die Tiefenprüfung aktiviert lassen. – BDL

Verwandte Themen