tga + alpha channel



  • hi ich verwende diesen code um eine tga zu laden und eine textur daraus zu machen:

    bool TEXTURE::
        LoadTGA(char* filename) 
        {    
        GLubyte     TGAheader[12]={0,0,2,0,0,0,0,0,0,0,0,0};    //Unkomprimierter TGA Header
        GLubyte     TGAcompare[12];                 //Wird verwendet um Header zu vergleichen
        GLubyte     header[6];                      //Die ersten 6 Bytes des Headers
        GLuint      bytesPerPixel;                  //BPP
        GLuint      imageSize;                      //RAM verbrauch
        GLuint      temp;                           //Temp Variable
    
        FILE* file = fopen(filename, "rb");         // TGA öffnen
    
        if(file==NULL                                                      ||   // Existiert die Datei?
           fread(TGAcompare,1,sizeof(TGAcompare),file)!=sizeof(TGAcompare) ||   // Sind die 12 Bytes des Headers vorhanden?
           memcmp(TGAheader,TGAcompare,sizeof(TGAheader))!=0               ||   // Steht im Header 0,0,2,0,0,0,0,0,0,0,0,0
           fread(header,1,sizeof(header),file)!=sizeof(header))                 // Wenn ja die nächsten 6 Bytes einlesen
            {
            if(file==NULL)                          // Wenn die Datei nicht existiert, dann Fehler ausgabe in Datei
                {
                loadlog.Output("TGA \"%s\" existiert nicht", filename);
                return false;                           
                }
            else
                {
                fclose(file);                       // Wenn sind etwas falsch gelaufen ist...
                loadlog.Output("TGA  \"%s\" kann nicht geladen werden", filename);
                return false;                       
                }
            }
    
        width = header[1] * 256 + header[0];        // TGA width herausbekommen (highbyte*256+lowbyte)
        height= header[3] * 256 + header[2];        // TGA height herausbekommen    (highbyte*256+lowbyte)
    
        if(width    <=0  ||                          // Width < oder <= 0?
           height<=0 ||                          // Height < oder <= 0?
            (header[4]!=24 && header[4]!=32))       // Datei nicht 24 oder 32 Bpp
            {
            fclose(file);                           // Wenn etwas falsch gelaufen ist...
            loadlog.Output("TGA \"%s\" kann nicht geladen werden", filename);
            return false;                           
            }
    
        bpp  = header[4];                           // Bpp in Variable schreiben
        bytesPerPixel= bpp/8;                       // Bpp/8 um tatsächliche bytesPerPixel herauszubekommen
        imageSize    = width*height*bytesPerPixel;  // RAM verbrauch
    
        data= new GLubyte [imageSize];              // Speicher reservieren
    
        if(data==NULL ||                            // Genug Speicher frei?
           fread(data, 1, imageSize, file)!=imageSize)  // Datei gleich groß wie reservierter Speicher?
            {
            if(data!=NULL)                          // Sind die Daten geladen worden?
                free(data);                         // Wenn ja speicher frei geben
    
            fclose(file);                           // Datei schließen
            return false;                           // Return False
            }
    
        for(GLuint i=0; i<int(imageSize); i+=bytesPerPixel)      // Schleife durch die Daten
            {                                       // Tausch 1. und 3. Byte
            temp     =data[i];                      // Temp
            data[i]  = data[i + 2];                 // 1 -> 3
            data[i+2]= temp;                        // 3 -> Temp(1)
    
    /*  if (data[i] == 0 && data[i+1] == 0 && data[i+1] == 0)
          data[i+3] = 0;
        else
          data[i+3] = 0xFF;*/
            }
    
        fclose (file);                              //Datei schließen
    
        loadlog.Output("TGA \"%s\" geladen", filename);
        return true;
        }
    
    bool TEXTURE::LoadTexture (char* filename, int fileFormat, GLfloat minFilter, GLfloat maxFilter)
    {
        if (fileFormat==TGA) LoadTGA(filename);
        else if (fileFormat==BMP) LoadBMP(filename);
        else 
        {
            loadlog.Output ("TEXTURE Format wird nicht unterstützt!");
            return false;
        }
    
        GLuint type=GL_RGBA;            //Default auf RGBA stellen (32 Bpp)
        if(bpp==24) type=GL_RGB;
        // Textur aus den Daten bilden
        glGenTextures(1, &ID);          //ID's erzeugen
    
        glBindTexture(GL_TEXTURE_2D, ID);            
    
        gluBuild2DMipmaps(GL_TEXTURE_2D, 3, width, height, type, GL_UNSIGNED_BYTE, data);
        glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, minFilter);
        glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, maxFilter);
    
        glTexParameteri(GL_TEXTURE_2D, GL_REPEAT, GL_CLAMP_TO_EDGE);
        glTexParameteri(GL_TEXTURE_2D, GL_REPEAT, GL_CLAMP_TO_EDGE);
    
        glTexImage2D(GL_TEXTURE_2D, 0, type, width, height, 0, type, GL_UNSIGNED_BYTE, data);
        loadlog.Output("TEXTURE %s(%i BPP) erstellt", filename,bpp);
        return true;
    }
    

    Ich möchte jetzt alles was schwarz ist nicht zeichnen, nichts leichter als das habe ich mir gedacht: einfach blending einschalten und weg sind die schwarzen flächen:

    glEnable(GL_BLEND);
     glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
     glEnable(GL_ALPHA_TEST);
     glAlphaFunc(GL_GREATER, 0);
    /*
     HIER DIE TEXTUR RAUFKLEBEN UND OBJEKT (BILLBOARD) ZEICHNEN
    */
      glDisable(GL_BLEND);
      glDisable(GL_ALPHA_TEST);
    

    Mein Problem ist das das nur richt mit den im code ausdokumenten teil
    (

    /*  if (data[i] == 0 && data[i+1] == 0 && data[i+1] == 0)
          data[i+3] = 0;
           else
          data[i+3] = 0xFF;*/
    

    )

    Mein Problem ist dass ich nicht verstehe wieso es ohne nicht funzt. es müsste ja automatisch auch gehen...



  • weiß keiner was?



  • meine frage anderst formuliert: wie kann ich nur gewisse stellen einer tga zeichnen



  • Du musst im Grafikprogramm deiner Wahl einen Alphachannel für die TGA erstellen. Dann musst du für OGL ein paar Renderstates setzen (weiß leider nicht welche, guck mal bei nehe.gamedev.net für mehr Infos).

    So sollte es funktionieren 🙂



  • Danke!! Habs gefunden 🙂
    Man muss einen State setzen: glEnable(GL_ALPHA_TEST)


Anmelden zum Antworten