Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » OpenGL » transparente Farbe

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: [ 1 ] > 2 <
010
08.01.2005, 12:28 Uhr
A-l-e-x



hab hierwww.levp.de/3d/tga.html eine Funktion gefunden die TGAs läd. Hab jetzt ein Problem: Wie mache ich jetzt aus den geladenen Daten eine Textur?

mfg A-l-e-x
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
011
08.01.2005, 13:45 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


NEHE Tutorial Lesson 25: Loading Compressed And Uncompressed TGA's


C++:
bool LoadTGA(TextureImage *texture, char *filename)            // Loads A TGA File Into Memory
{    
    GLubyte        TGAheader[12]={0,0,2,0,0,0,0,0,0,0,0,0};    // Uncompressed TGA Header
    GLubyte        TGAcompare[12];                                // Used To Compare TGA Header
    GLubyte        header[6];                                    // First 6 Useful Bytes From The Header
    GLuint        bytesPerPixel;                                // Holds Number Of Bytes Per Pixel Used In The TGA File
    GLuint        imageSize;                                    // Used To Store The Image Size When Setting Aside Ram
    GLuint        temp;                                        // Temporary Variable
    GLuint        type=GL_RGBA;                                // Set The Default GL Mode To RBGA (32 BPP)

    FILE *file = fopen(filename, "rb");                        // Open The TGA File

    if(    file==NULL ||                                        // Does File Even Exist?
        fread(TGAcompare,1,sizeof(TGAcompare),file)!=sizeof(TGAcompare) ||    // Are There 12 Bytes To Read?
        memcmp(TGAheader,TGAcompare,sizeof(TGAheader))!=0                ||    // Does The Header Match What We Want?
        fread(header,1,sizeof(header),file)!=sizeof(header))                // If So Read Next 6 Header Bytes
    {
        fclose(file);                                        // If Anything Failed, Close The File
        return false;                                        // Return False
    }

    texture->width  = header[1] * 256 + header[0];            // Determine The TGA Width    (highbyte*256+lowbyte)
    texture->height = header[3] * 256 + header[2];            // Determine The TGA Height    (highbyte*256+lowbyte)
    
     if(    texture->width    <=0    ||                                // Is The Width Less Than Or Equal To Zero
        texture->height    <=0    ||                                // Is The Height Less Than Or Equal To Zero
        (header[4]!=24 && header[4]!=32))                    // Is The TGA 24 or 32 Bit?
    {
        fclose(file);                                        // If Anything Failed, Close The File
        return false;                                        // Return False
    }

    texture->bpp    = header[4];                            // Grab The TGA's Bits Per Pixel (24 or 32)
    bytesPerPixel    = texture->bpp/8;                        // Divide By 8 To Get The Bytes Per Pixel
    imageSize        = texture->width*texture->height*bytesPerPixel;    // Calculate The Memory Required For The TGA Data

    texture->imageData=(GLubyte *)malloc(imageSize);        // Reserve Memory To Hold The TGA Data

    if(    texture->imageData==NULL ||                            // Does The Storage Memory Exist?
        fread(texture->imageData, 1, imageSize, file)!=imageSize)    // Does The Image Size Match The Memory Reserved?
    {
        if(texture->imageData!=NULL)                        // Was Image Data Loaded
            free(texture->imageData);                        // If So, Release The Image Data

        fclose(file);                                        // Close The File
        return false;                                        // Return False
    }

    for(GLuint i=0; iimageData[i];                            // Temporarily Store The Value At Image Data 'i'
        texture->imageData[i] = texture->imageData[i + 2];    // Set The 1st Byte To The Value Of The 3rd Byte
        texture->imageData[i + 2] = temp;                    // Set The 3rd Byte To The Value In 'temp' (1st Byte Value)
    }

    fclose (file);                                            // Close The File

    // Build A Texture From The Data
    glGenTextures(1, &texture[0].texID);                    // Generate OpenGL texture IDs

    glBindTexture(GL_TEXTURE_2D, texture[0].texID);            // Bind Our Texture
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);    // Linear Filtered
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);    // Linear Filtered
    
    if (texture[0].bpp==24)                                    // Was The TGA 24 Bits
    {
        type=GL_RGB;                                        // If So Set The 'type' To GL_RGB
    }

    glTexImage2D(GL_TEXTURE_2D, 0, type, texture[0].width, texture[0].height, 0, type, GL_UNSIGNED_BYTE, texture[0].imageData);

    return true;                                            // Texture Building Went Ok, Return True
}



--
class God : public ChuckNorris { };

Dieser Post wurde am 08.01.2005 um 13:46 Uhr von FloSoft editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
012
08.01.2005, 15:50 Uhr
A-l-e-x



Irgendwie mag mich das TGA-Format nicht so richtig. Hab versucht ein transparentes TGA zu erzeugen (mit PSP5), hat aber nicht geklappt. So macht es jetzt für mich kein Sinn da weiter nachzuhacken.

Will jetzt mit PNG versuchen. Kann mir einer da einer helfen? Ein Link wird auch reichen.

mfg A-l-e-x
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
013
09.01.2005, 16:21 Uhr
A-l-e-x




Zitat von Drager:
oder lad ganz normal ein bmp, und schreib ne funktion die , die einzelnen pixel mit deiner gewünschten transparenzfarbe vergleicht und dann den alphawert (4 byte) auf 1 und den rest auf 0...


Wie mache ich das? Kann mir einer ein kleines Beispiel zeigen oder auf 'nen Link verweisen?

mfg A-l-e-x
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
014
10.01.2005, 22:57 Uhr
Drager




C++:
int size = Image->sizeY * Image->sizeX * 4;

AUX_RGBImageRec *NewImage = new AUX_RGBImageRec[1];

NewImage->data = new unsigned char[size];

NewImage->sizeX = Image->sizeX;
NewImage->sizeY = Image->sizeY;





dann einfach jedes 4 mit nen alphawert füllen und die anderen 1zu1 kopieren....

also sowas wie :

C++:

if(NewImage->data[i] == rot && NewImage->data[i + 1] == blau && NewImage->data[i + 2] == gruen)
{

    NewImage->data[i + 3] = alphawert;
}





das ganze dann als schleife über alle pixel... das alte bild dann löschen und newimage verwenden... dann noch bei textur erstellung statt GL_RGB , GL_RGBA , dann blending , dann fertig....

Dieser Post wurde am 10.01.2005 um 22:59 Uhr von Drager editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
015
12.01.2005, 19:29 Uhr
A-l-e-x



sieht die schleife dann so aus?

C++:
for(int i=0; i < NewImage->sizeX*NewImage->sizeY; i+=4){...}


mfg A-l-e-x
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: [ 1 ] > 2 <     [ OpenGL ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: