Alphatextur (OpenGL)



  • Hi Leute,
    ich würde gerne in OpenGL ne Textur mit Alphakanal haben, damit halt einfach so teile unsichtbar sind. Nur will cih dafür halt trotzdem Bitmaps oder so verwenden, deshalb würde ich gerne die textur gerne aus ner normalen textur und ner Schwarz-Weiß masking Textur mischen. Aber halt schon beim Laden und nicht erst so komisch uneffizient während des Anzeigens wie beim Nehe Tut... oder geht das überhaupt nicht??

    Vorschläge und Code Beispiele wären sehr nett 🙂



  • ich verstehe zwar nur 50% von dem was da oben steht und das nehe tut kenne ich auch nicht welche lesson ?
    aber vielleicht meinst du das

    // fügt beim laden eines bitmaps einen zusätzlichen alpha-kanal hinzu
    // zum laden wird die aux bibilothek benutzt
        AUX_RGBImageRec *pFontImage = NULL;
    
        if((pFontImage = auxDIBImageLoad("irgendetwas.bmp")) == NULL)
            return false;
    
        glGenTextures(1, &m_TexFont);                // id
        glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
        glBindTexture(GL_TEXTURE_2D, m_TexFont);
    
        unsigned long size = pFontImage->sizeX * pFontImage->sizeY * 4;
        unsigned char *pData = new unsigned char[size];
    
        for(unsigned long i = 0; i < (unsigned)pFontImage->sizeX * pFontImage->sizeY; i++)
        {
            unsigned char red, green, blue;
    
            red     = pFontImage->data[(i * 3) + 0];
            green   = pFontImage->data[(i * 3) + 1];
            blue    = pFontImage->data[(i * 3) + 2];
    
            pData[(i * 4) + 0] = red;
            pData[(i * 4) + 1] = green;
            pData[(i * 4) + 2] = blue;
    
            if(blue == 0 && green == 0 && red == 0)     // schwarz als transparent
                pData[(i * 4) + 3] = 0;
            else
                pData[(i * 4) + 3] = 255;
        }
    
        gluBuild2DMipmaps(
            GL_TEXTURE_2D,
            4,
            pFontImage->sizeX,
            pFontImage->sizeY,
            GL_RGBA,
            GL_UNSIGNED_BYTE,
            pData);
    
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST);
        glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
    


  • ja so ungefähr meins ichs 🙂
    wobei ich halt noch eine zweite textur laden will (schwarz- weiß) und überall wo die schwarz ist dann die erste transprent mache... Also das ich den alphakanal aus ner anderen Textur bekomme!
    Mit dem umständlichen Nehe tut meine ich das hier: http://nehe.gamedev.net/data/lessons/lesson.asp?lesson=20

    Aber danke schon mal 🙂



  • aber wieso willst du eine zweite laden ?
    du hast doch schon alles was in deim bitmap scharz ist transparent gemacht.
    jetzt musst du nur noch alpha-blending einschalten

    glEnable(GL_BLEND);
    glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA); 
    // tu was du nicht lassen kannst
    glDisable(GL_BLEND);
    


  • aber wenn ich zB das schwarze nicht transparent haben will? Naja, du hast eigentlich schon recht, irgend ne Farbe die den "Alphakanalknecht" 😃 macht wird sich wohl immer finden. Dann werd ichs wohl auch so machen, ist eigentlich auch einfacher und Platzsparender.

    Vielen Dank für diese tolle Lösung und den Code 🙂



  • Wenn du Schwarz brauchst dann nimmst du eben RGB 0,0,1
    Ich glaube kaum, das jemand den Unterschied merkt 😃


Anmelden zum Antworten