4 Stimmen

Wie rendere ich eine GL_ALPHA-Textur?

Ich versuche, mit der FTGL-Schriftartenbibliothek zu arbeiten, um eine Textur-gemappte Schriftart zu erstellen und sie auf den Bildschirm zu übertragen. Die Bibliothek erstellt eine Textur in der GL_ALPHA Format, um die Schriftglyphen zu speichern, und wenn Sie ihm dann sagen, dass er eine Zeichenkette rendern soll, geht er durch und glBegin(GL_QUADS) und rendert jede Glyphe genau so, wie Sie es erwarten würden.

Das einzige Problem ist, dass ich keinen Text erhalte. In einem Szenario erhalte ich solide schwarze Boxen anstelle von Text, in einem anderen bekomme ich nichts. Ich habe den Code unter gDEBugger ausgeführt, um sicherzustellen, dass die Textur immer hochgeladen und ordnungsgemäß eingerichtet, und alles sieht richtig, aber ich bin immer noch nicht sehen keine Ausgabe.

Ich habe die offensichtlichen Dinge ausprobiert. Aufrufen von glColor vorher zu versuchen, eine Textfarbe festzulegen, bringt nichts. Ebenso wenig wie der Versuch, sicherzustellen, dass Alpha-Blending richtig funktioniert, wie so:

glEnable(GL_ALPHA_TEST);
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

Hat jemand eine Idee, was mir fehlt, um das Rendering von einem GL_ALPHA Textur auf dem Bildschirm richtig angezeigt werden?

3voto

Nicol Bolas Punkte 409659

Nach einer Untersuchung des FTGL-Codes ist klar, dass die API so konzipiert ist, dass sie die Textdarstellung selbst übernimmt. Es wird erwartet, dass Sie die Rendering-Funktionen aufrufen, die dann intern die OpenGL-Aufrufe durchführen.

Anders ausgedrückt: FTGL ist nicht darauf ausgelegt, eine Schriftart in eine Textur zu laden, Ihnen dann dieses Texturobjekt zu geben und Sie die Glyphen selbst zeichnen zu lassen. Das bedeutet nicht, dass Sie kann nicht dass die API Ihnen dabei nicht helfen wird.

Der Grund, warum Sie schwarz bekommen, ist GL_ALPHA Texturen geben beim Zugriff Nullen für die RGB-Komponente zurück. Da Sie GL_MODULATE in Ihrer Texturumgebung, die Null mit dem RGB-Teil der Farbe multiplizieren wird.

Um das zu erreichen, was Sie beabsichtigen, müssen Sie die Option GL_TEXTURE_ENV_MODE a GL_COMBINE anstelle von GL_MODULATE . Das heißt, Sie müssen die Umweltmodus kombinieren was nicht einfach ist. Nachdem ich die feste Funktion für Shader so ziemlich aufgegeben habe, sobald es sie gab, habe ich die Kombinierer schon lange nicht mehr angerührt. Nehmen Sie das Folgende also mit Vorsicht auf. Hier ist eine Vermutung, wie der Umgebungscode aussehen sollte:

glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE);

glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_REPLACE);
glTexEnvi(GL_TEXTURE_ENV, GL_SRC0_RGB, GL_PRIMARY_COLOR);
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_RGB, GL_SRC_COLOR);

glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_ALPHA, GL_REPLACE);
glTexEnvi(GL_TEXTURE_ENV, GL_SRC0_ALPHA, GL_TEXTURE);
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_ALPHA, GL_SRC_ALPHA);

Sie möchten eine Farbe erzeugen, deren RGB-Anteil von glColor und der Alpha-Teil kommt von der Textur. Dies ist, wie Sie das tun.

Auf Englisch heißt es in der ersten Zeile, dass der Texturumgebungsmodus "combine" ist, wodurch ein komplizierterer Betriebsmodus aktiviert wird. Die nächsten drei Zeilen geben an, wie der RGB-Anteil der Farbe erzeugt wird. Die GL_COMBINE_RGB eingestellt auf GL_REPLACE bedeutet, dass der RGB-Quellwert 0 dem RGB-Ausgangswert entspricht. Einstellung GL_SRC0_RGB a GL_PRIMARY_COLOR bedeutet, dass der RGB-Quellwert 0 die Primärfarbe ist, d.h. die Farbe, die durch die Scheitelpunktverarbeitung erzeugt wird (d.h., wenn Sie keine Beleuchtung verwenden, ist dies nur das, was Sie mit glColor ). Einstellung GL_OPERAND0_RGB a GL_SRC_COLOR bedeutet, die Farbe so zu nehmen, wie sie ist (es gibt spezielle Operationen, wie take 1 - the color oder was auch immer).

In den nächsten 3 Zeilen wird festgelegt, woher der Alpha-Anteil der Ausgabefarbe kommt. Die GL_COMBINE_ALPHA eingestellt auf GL_REPLACE bedeutet, dass die Quelle alpha Wert 0 (anders als bei der Quelle RGB Wert 0) ist der Ausgangsalphawert. Einstellung GL_SRC0_ALPHA a GL_TEXTURE bedeutet, dass der Quell-Alpha-Wert 0 aus der Textur der aktuellen Textureinheit stammt. Einstellung GL_OPERAND0_ALPHA a GL_SRC_ALPHA bedeutet, dass der Alphawert so übernommen wird, wie er ist (wie zuvor können Sie hier eine Transformation auf den Alphawert anwenden).

Alternativ, wenn Ihre OpenGL-Implementierung über ARB_texture_swizzle zur Verfügung steht, können Sie eine Swizzle-Maske einrichten, um die GL_ALPHA Format in GL_INTENSITY . Dann können Sie GL_MODULATE als Ihr GL_TEXTURE_ENV_MODE . Sie müssen jedoch darauf achten, dass Ihr Mischmodus auf glBlendMode(GL_ONE, GL_ONE_MINUS_SRC_ALPHA) . Dies ist notwendig, weil GL_MODULATE multipliziert die Farbe mit dem Alphawert. Wenn Sie GL_SRC_ALPHA anstelle von GL_ONE würden Sie die Multiplikation mit Alpha durchführen zweimal (einmal in der Texturentwicklungsphase, einmal in der Mischphase).

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X