TGA loader



  • hallo zusammen,

    ich versteh die welt nicht mehr ich bastel schon seit tagen an meinen tga loader und schaff es einfach nicht. vielleicht habe ich tomaten auf den augen oder ich weis nicht.

    WAS IST FALSCH !!!!!!!!!!!!!!!!!!!!!!!! 😕 😕 😕

    // bis hierher tga header auslesen und bedingungen stellen
    // nur unkomprimierte 24 oder 32 bit tga's
    
    // sollte jeden pixel auslesen und dann den alpha wert ändern oder hinzufügen
        unsigned long fData = width * height * (bits / 8);          // image datengröße
        unsigned long nData = width * height * 4;                   // neue image datengröße
        unsigned char *pData = new unsigned char[nData];
    
        for(unsigned long i = 0; i < (unsigned long)(width * height); i++)
        {
            unsigned char red, green, blue, alphabyte;
    
            switch(bits)
            {
                case 24:
                        filetga >> blue;
                        filetga >> green;
                        filetga >> red;
                        pData[i + 0] = red;
                        pData[i + 1] = green;
                        pData[i + 2] = blue;
    
                        if(blue == 0 && green == 0 && red == 0 && bBlackTransparent)
                            pData[i + 3] = 0;
                        else
                            pData[i + 3] = 255;
                    break;
                case 32:
                        filetga >> blue;
                        filetga >> green;
                        filetga >> red;
                        filetga >> alphabyte;
    
                        if(blue == 0 && green == 0 && red == 0 && bBlackTransparent)
                            alphabyte = 0;
    
                        pData[i + 0] = red;
                        pData[i + 1] = green;
                        pData[i + 2] = blue;
                        pData[i + 3] = alphabyte;
                    break;
            }
        }
    
        gluBuild2DMipmaps(GL_TEXTURE_2D, 4, width, height, GL_RGBA, GL_UNSIGNED_BYTE, pData);
    

    filereader

    class rFile
    {
        public:
            rFile();
            ~rFile();
    
            bool Create(char *szFilename, char *szMode);
            void Kill();
    
            bool Read(void *buffer, unsigned long length);
    
            long GetPosition();
    
            bool SeekFromStart(long length);
            bool SeekFromHere(long length);
            bool SeekFromEnd(long length);
    
            bool IsEOF() {return m_bEOF;}
    
            rFile& operator>>(unsigned char &n)  {Read(&n, sizeof(unsigned char)); return *this;}
            rFile& operator>>(unsigned short &n) {Read(&n, sizeof(unsigned short)); return *this;}
            rFile& operator>>(unsigned long &n)  {Read(&n, sizeof(unsigned long)); return *this;}
            rFile& operator>>(char &n)  {Read(&n, sizeof(char)); return *this;}
            rFile& operator>>(short &n) {Read(&n, sizeof(short)); return *this;}
            rFile& operator>>(long &n)  {Read(&n, sizeof(long)); return *this;}
            rFile& operator>>(bool &n)  {Read(&n, sizeof(bool)); return *this;}
    
        protected:
            FILE*   m_pFile;
            bool    m_bEOF;
    };
    

    read funktion

    bool rFile::Read(void *buffer, unsigned long length)
    {
        if(m_pFile == 0) return false;
    
        if(fread(buffer, length, 1, m_pFile) == 1)
        {
            return true;
        }
        else
        {
            if(feof(m_pFile) != 0)
                m_bEOF = true;
            else
                m_bEOF = false;
    
            return false;
        }
    
        return true;
    }
    

    wenn noch jemand mehr code braucht nur schreien



  • Es würde die Fehlersuche stark vereinfachen wenn du eine genauere Fehlerbeschreibung geben würdest. Was klappt denn nicht ?



  • sorry 😃 ganz vergessen. er zeigt mir nur eine weisse fläche an als wäre keine textur da.



  • Liest er die Werte denn wenigstens korrekt ein ? D.h. ist das TGA in deiner Load Funktion in Ordnung ?



  • also die komplette schleife hab ich noch nicht überprüft da mir 256*256 = 65536 schleifen durchgänge zuviel sind (zeit ist geld) aber die ersten paar stimmen schon.



  • Hi .)
    Bist du dir sicher, das du Texturing angeschaltet hast ? Wenn du von weißen Flächen redest, hört sich das ziemlich verdächtig ein. Im Init-Code sollte ein glEnable(GL_TEXTURE_2D); stehen.
    Oh. Und ich seh grad, das du die Daten falsch füllst.
    Statt pData[i + 0] usw... solltest du pData[i*bits/8 + 0] usw schreiben, weil du ja i immer nur um 1 erhöhst, aber somit die alten Daten überschreibst. So wird im nächsten Durchlauf das alte pData[i+1] durch ein einfaches pData[i + 0] überschrieben.

    cu



  • texturen sind angeschaltet. bin ich mir ganz sicher da andere texturen(bmp) auch dargestellt werden. 😃

    pData[i * 4 + 0] = farbe; habe ich gemacht, aber texture bleibt weis. 😕 😕 😕 😕


  • Mod

    füll das array mit irgend nem testwerd z.B. mit i dann wenn die textur dann bund erscheint, wissen wir wenigstens dass es nicht am umgang mit opengl liegt.

    rapso->greets();



  • @rapso
    sehr gute idee. doch leider funzt net.

    for(unsigned long i = 0; i < nData; i++)
     pData[i] = 125;
    

    das heisst es muss an gl liegen ?!?!?!?

    [ Dieser Beitrag wurde am 31.01.2003 um 14:36 Uhr von miller_m editiert. ]


Anmelden zum Antworten