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).