Alpha-Textur colorieren
-
Also ich sitze dann doch mal wieder vor openGL und möchte endlich mal einen funktionierenden Font hinbekommen. Mein Font liegt im Alpha-channel eines PNG.
Das geht zwar schon relativ gut, aber nur einfarbig..
Kann mir wer erklären, ob und wie ich das ganze jetzt coloriere?Nen glColor absetzen reicht ja wohl nich..
-
DocJunioR schrieb:
Nen glColor absetzen reicht ja wohl nich..
Doch, sollte eigentlich schon.
-
dann mach ich mal wieder irgendwas falsch ^^
hier mal mein- eigentlich etwas umständlicher- Testcode.
#include "Font.h" Font::Font(char *filename) { glGenTextures(1, &this->font); glBindTexture(GL_TEXTURE_2D, this->font); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP); this->font = pngBind(filename, PNG_NOMIPMAP, PNG_ALPHA, &info, GL_CLAMP, GL_NEAREST, GL_NEAREST); if (this->font == 0) { puts("Can't load file"); exit(1); } } Font::~Font() { } void Font::print(float x, float y, float scale, string text) { int i, a, n, lo, hi; float sH, sL, rf = 1.0 / 16.0; char *c_str = (char*)text.c_str(); glBlendFunc(GL_ONE,GL_ONE_MINUS_SRC_ALPHA); // Select The Type Of Blending glEnable(GL_BLEND); glAlphaFunc (GL_GREATER, 0.0f); glEnable (GL_ALPHA_TEST); glEnable (GL_TEXTURE_2D); glBindTexture(GL_TEXTURE_2D, this->font); int vp[4]; glGetIntegerv(GL_VIEWPORT, vp); int height = vp[3] - vp[1]; // glColor3f (0.3,0.1,0.7); glBegin(GL_QUADS); i = 0; n = 0; for (a = 0; a < (int)text.size(); a++) { if ( c_str[a] == '\n') { i = 0; n++; } else { lo = c_str[a] & 0x0f; hi = (c_str[a] & 0xf0) /16; sH = rf * (float)hi; sL = rf * (float)lo; glTexCoord2f(sL , sH ); glVertex2f(x + (i * scale) , height - y + (n * scale) ); glTexCoord2f(sL , sH + rf ); glVertex2f(x + (i * scale) , height - y + (n * scale) - scale); glTexCoord2f(sL + rf , sH + rf ); glVertex2f(x + (i * scale ) + scale , height - y + (n * scale) - scale); glTexCoord2f(sL + rf , sH ); glVertex2f(x + (i * scale ) + scale , height - y + (n * scale) ); i++; } } glEnd(); glDisable (GL_TEXTURE_2D); glDisable (GL_BLEND); glDisable (GL_ALPHA_TEST); }Ist aus einem uralten Projekt von mir zusammengestrickt, welches aber nie richtig funktionierte. Habs jetzt wiedergefunden und einfach mal als Basis genutzt..
-
Hast du vielleicht die Beleuchtung eingeschaltet?
Das könnte der Grund sein, warum er die Vertexfarben ignoriert.
Schalte die Beleuchtung mal aus, mit glDisable(GL_LIGHTING).
-
Hmm.. klappt leider nicht.
Wenn ich aber GL_TEXTURE_2D ausschalte, haben die gezeichneten Quadrate die richtige Farbe- Lighting, etc. ist also prinzipiell schonmal korrekt eingestellt, denk ich. Hängt irgendwo am Texturing..
-
Hmm, normalerweise wird die Texturfarbe einfach mit der Vertexfarbe mutlipliziert. Zumindest wenn du nichts umgestellt hast.
Dein Alpha-Blending schaut sehr seltsam aus.
Mach es mal so:glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
-
hab da einiges ausprobiert- interessante effekte erziehlt, aber nicht, was ich wollte..