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


Anmelden zum Antworten