Anzeige:
Ergebnis 1 bis 5 von 5

Thema: opengl: problem beim laden von texturen

  1. #1
    Registrierter Benutzer
    Registriert seit
    12.09.2004
    Beiträge
    69

    opengl: problem beim laden von texturen

    hallo
    ich hab mich vom beispiel 6 von nehe.gamedev.net bedient.
    leider gibt es probleme beim lesen aus einer bmp datei:
    Code:
    /* Image type - contains height, width, and data */
    struct Image {
        unsigned long sizeX;
        unsigned long sizeY;
        char *data;
    };
    typedef struct Image Image;
    
    // quick and dirty bitmap loader...for 24 bit bitmaps with 1 plane only.
    // See http://www.dcs.ed.ac.uk/~mxr/gfx/2d/BMP.txt for more info.
    int ImageLoad(char *filename, Image *image) {
        FILE *file;
        unsigned long size;                 // size of the image in bytes.
        unsigned long i;                    // standard counter.
        unsigned short int planes;          // number of planes in image (must be 1)
        unsigned short int bpp;             // number of bits per pixel (must be 24)
        char temp;                          // temporary color storage for bgr-rgb conversion.
    
        // make sure the file is there.
        if ((file = fopen(filename, "rb"))==NULL)
        {
            printf("File Not Found : %s\n",filename);
            return 0;
        }
    
        // seek through the bmp header, up to the width/height:
        fseek(file, 18, SEEK_CUR);
    
        // read the width
        if ((i = fread(&image->sizeX, 4, 1, file)) != 1) {
            printf("Error reading width from %s.\n", filename);
            return 0;
        }
        printf("Width of %s: %lu\n", filename, image->sizeX);
    
        // read the height
        fseek(file,22,SEEK_SET);
        if ((i = fread(&image->sizeY, 4, 1, file)) != 1) {
            printf("Error reading height from %s.\n", filename);
            return 0;
        }
        printf("Height of %s: %lu\n", filename, image->sizeY);
    
        // calculate the size (assuming 24 bits or 3 bytes per pixel).
        size = image->sizeX * image->sizeY * 3;
    
        // read the planes
        if ((fread(&planes, 2, 1, file)) != 1) {
            printf("Error reading planes from %s.\n", filename);
            return 0;
        }
        if (planes != 1) {
            printf("Planes from %s is not 1: %u\n", filename, planes);
            return 0;
        }
    
        // read the bpp
        if ((i = fread(&bpp, 2, 1, file)) != 1) {
            printf("Error reading bpp from %s.\n", filename);
            return 0;
        }
        if (bpp != 24) {
            printf("Bpp from %s is not 24: %u\n", filename, bpp);
            return 0;
        }
    
        // seek past the rest of the bitmap header.
        fseek(file, 24, SEEK_CUR);
    
        // read the data.
        image->data = (char *) malloc(size);
        if (image->data == NULL) {
            printf("Error allocating memory for color-corrected image data");
            return 0;
        }
    
        if ((i = fread(image->data, size, 1, file)) != 1) {
            printf("Error reading image data from %s.\n", filename);
            return 0;
        }
    
        for (i=0;i<size;i+=3) { // reverse all of the colors. (bgr -> rgb)
            temp = image->data[i];
            image->data[i] = image->data[i+2];
            image->data[i+2] = temp;
        }
    
        // we're done.
        return 1;
    }
    ich erhlte bei compilieren mittels "gcc lesseon6.c -lGL -lGLU -lglut" keine fehler oder warnungen, allerdings bei der ausführung des programms:
    Code:
    ./a.out
    Width of Data/lesson6/NeHe.bmp: 256
    Height of Data/lesson6/NeHe.bmp: 46909632807168
    Error allocating memory for color-corrected image data
    der erste wert stimmt, der zweite definitiv nicht !
    ich hab übrigens deises tutorial schonmal gemacht und ich kann mich daran erinnern, dass er ohne probleme auszuführen ging. die bmp ist übrigens auch in ordnung, ich hab sie mit einer anderen getestet, was zum gleichen ergebnis führt.
    hier der download link:
    http://nehe.gamedev.net/data/lessons...esson06.tar.gz
    ich nutze linux gentoo mit kernel 2.6.15
    ich hab auch mich erkundigt, wie die bmp header aufgebaut ist und ich bin der meinung, dass der source an sich richtig ist !
    dennoch kann ich mir die fehler die auftreten nicht erklären.
    bitte probiert den source aus, sofern ihr könnt (ich mein wegen linux)
    mich würde zugern interessieren warum das nicht funktioniert .

  2. #2
    Registrierter Benutzer
    Registriert seit
    20.11.2004
    Beiträge
    122
    In lesson6.c:
    int texture[1] -> unsigned int texture[1]

    Danach hat's bei mir geklappt.

    Gruß
    Kai
    Geändert von `kk (18-01-2006 um 20:51 Uhr)
    C, Python, OCaml

  3. #3
    Registrierter Benutzer
    Registriert seit
    12.09.2004
    Beiträge
    69
    hmm, das ist merkwürdig, sorichtig geht das bei mir nicht
    kann es seun, dass glibc oder so mist baut ?

  4. #4
    Registrierter Benutzer
    Registriert seit
    20.11.2004
    Beiträge
    122
    Was heißt "so richtig"?
    Hast du die Aenderung vorgenommen?
    Welcher Fehler taucht auf? (-W -Wall)

    Gruß
    Kai
    C, Python, OCaml

  5. #5
    Registrierter Benutzer
    Registriert seit
    11.03.2004
    Beiträge
    40
    Also genau hab ich es mir nicht angesehen, aber es sieht ja so aus, als ob bei image->sizeY etwas negatives gelesen wird, das dann zu einer grossen positiven Zahl wird, da sizeY ja unsigned ist.
    Schau dir dazu mal
    http://de.wikipedia.org/wiki/Windows_bitmap
    an, konkret die Beschreibung von biHeight

    Offenbar müssten sowohl sizeX und sizeY long sein (d.h. nicht unsigned). Evtl reicht es anschliessend wenn du einfach sizeY *= -1; machst.

    CU
    Andi

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •