[OPENGL] glColor() beeinflusst Textur



  • Hallo zusammen,
    ich hoffe ihr könnt mir weiterhelfen.

    Es geht um OpenGL, genauer: Blending

    Ich beschreibe mal die Symptomatik bevor ich den Code dazu poste.

    Also, ich würde gerne eine Textur auf ein GL_QUAD mappen,
    das hab ich auch gemacht 🙂
    Die Grafik besteht aus aus den Kanälen RGBA, alles was einen Alphawert
    unter 1.0 hat soll natürlich entsprechend 'transparent' dargestellt werden.
    Das klappt auch soweit, der Rest der Grafik wird dabei jedoch von der Farbe
    überlagert die zuletzt mit glColor() definiert wurde.

    Könnt ihr mir bitte sagen an was das liegt und wie ich das umgehen kann?

    Der Code ist nur Auszugsweise, alles wäre einfach zuviel und unübersichtlich 🙂

    PIXELFORMATDESCRIPTOR pfd;
    
        int iFormat;
    
        /* get the device context (DC) */
        *hDC = GetDC(hwnd);
    
        /* set the pixel format for the DC */
        ZeroMemory(&pfd, sizeof(pfd));
    
        pfd.nSize = sizeof(pfd);
        pfd.nVersion = 1;
        pfd.dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER;
        pfd.iPixelType = PFD_TYPE_RGBA;
        pfd.cColorBits = 24;
        pfd.cDepthBits = 16;
        pfd.iLayerType = PFD_MAIN_PLANE;
    
        iFormat = ChoosePixelFormat(*hDC, &pfd);
    
        SetPixelFormat(*hDC, iFormat, &pfd);
    
        /* create and enable the render context (RC) */
        *hRC = wglCreateContext(*hDC);
    
        wglMakeCurrent(*hDC, *hRC);
    
    unsigned char alphaRawData[] = { [gekürzt] };
    
        glBindTexture(GL_TEXTURE_2D, 13);
        glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
    
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    
        glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
    
        glTexImage2D (GL_TEXTURE_2D, 0, GL_RGBA, 32, 32, 0, GL_RGBA, GL_UNSIGNED_BYTE, &alphaRawData);
    
        glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
        glEnable(GL_BLEND);
    
        // DAS IST DER ÜBELTÄTER!!!
        // Wie verhindere ich dass diese Farbe hier meine Textur beeinflusst?
        glColor4f(1.0, 1.0, 1.0, 1.0);
    
        glEnable(GL_TEXTURE_2D);
        glBindTexture (GL_TEXTURE_2D, 13);
    
        glBegin (GL_QUADS);
            glTexCoord2f (0.0, 1.0);
            glVertex3f([gekürzt]);
    
            glTexCoord2f (1.0, 1.0);
            glVertex3f([gekürzt]);
    
            glTexCoord2f (1.0, 0.0);
            glVertex3f([gekürzt]);
    
            glTexCoord2f (0.0, 0.0);
            glVertex3f([gekürzt]);
        glEnd ();
    
        glDisable(GL_TEXTURE_2D);
    
        SwapBuffers();
    


  • Eigentlich ist es doch gerade so gedacht, dass du mit glColor() die Texturvertices einfärben kannst. Normalerweise ist bei deinem Blend-Modus Weiss die Farbe, welche die Textur unverändert lässt. Die Funktion glTexEnvf() kenne ich leider nicht, ändert sie vielleicht etwas daran?



  • Um die Vorschläge vorweg zu nehmen:

    statt GL_MODULATE habe ich bereits GL_BLEND versucht
    und eine Farbtiefe von 32 Bit auch, bringt leider beides
    nicht den erwünschten Effekt.

    Könnte mir noch vorstellen dass es mit

    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
    

    zusammenhängt, aber insgesamt komm ich einfach auf kein vernünftiges Ergebnis.

    Habe auch schon etliche Kombinationen versucht, leider alles ohne Erfolg.

    Seit zwei vollen Tagen hänge ich an dem Problem, wer mit helfen kann: Bitte tu es! 😉

    edit:

    Eigentlich ist es doch gerade so gedacht, dass du mit glColor() die Texturvertices einfärben kannst. Normalerweise ist bei deinem Blend-Modus Weiss die Farbe, welche die Textur unverändert lässt. Die Funktion glTexEnvf() kenne ich leider nicht, ändert sie vielleicht etwas daran?

    Die Aussage verwundert mich, aber das macht den Dschungel nicht lichter - für mich. Ohne die Funktion glTexEnvf() bekomme ich garkeine Transparents, die Transparenten Stellen werden dann komplett in der letzten Farbe eingefärbt die durch glColor gegeben wurde.



  • glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
    

    sollte nicht das Problem sein, zumindest nicht alleine. Ich habe das auch schon verwendet – beim Aufruf von glColor() mit Weiss bleibt die Textur unverändert. Falls eine andere Farbe zuletzt gesetzt wurde, setze eben Weiss.

    Was heisst "ohne Erfolg"? Hast du das Problem schon versucht zu minimieren und möglichst viele Dinge weggelassen? Hast du es schon fertiggebracht, eine Textur unverfärbt darzustellen? Probier ansonsten einen einfachen Code von NeHe aus, z.B. "Your first polygon".

    P.S. Ich würde glEnable(GL_BLEND) vor den blending-spezifischen Aufrufen setzen, auch wenn es keine Rolle spielen sollte.



  • hallo nexus,
    es ist immer wieder lustig,
    hab ich mir den ganzen tag den kopf zerbrochen,
    so schnell war es mir sonnenklar also du mir
    erklärt hast dass dieses einfärben normal sei
    und weiß eigentlich nichts ändert.

    ich habe die kanäle vertauscht (bmp -> opengl) und dachte daher es wäre verfärbt 🙂

    danke für deine hilfe!



  • Schön, dass ich helfen konnte. Ich habe das Problem ehrlich gesagt für viel komplizierter gehalten (z.B. irgendein Seiteneffekt am anderen Ende der OpenGL-Statusmaschine), aber gut, dass du nicht noch mehr Zeit damit verloren hast. 🙂



  • ja, das dachte ich auch 🙂
    gute nacht und danke nochmal.


Anmelden zum Antworten