NeHe Texturen Mappen (OpenGL mit SDL)



  • Hi,

    ich bin gerade dabei die Tutorials von NeHe durchzuarbeiten, und habe ein Verständnisproblem, bei dem Tutorial zu "Texture Mapping"

    Da wir eine Bitmap via SDL geladen.
    Da steht also:

    // ...
    SDL_Surface* image;
    Uint8* tmpbuf, *rowhi, *rowlo, tmpch;
    
    image = SDL_LoadBMP(file);
    
    tmpbuf = (Uint8)malloc(image->pitch);
    
    rowhi = (Uint8*)image->pixels;
    rowlo = rowhi + (image->h * image->pitch) - image->pitch;;
    
    for (i = 0; i < image->h/2; ++i) {
      for (j = 0; i < image->w; ++j) {
        tmpch = rowhi[j*3];
        rowhi[j*3] = rowhi[j*3+2];
        rowhi[j*3+2] = tmpch;
        tmpch = rowlo[j*3];
        rowlo = [j*3] = rowlo[j*3+2];
        rowlo = [j*3+2] = tmpch;
      }
      memcpy (tmpbuf, rowhi, image->pitch);
      memcpy (rowhi, rowlo, image->pitch);
      memcpy (rowlo, tmpbuf, image->pitch);
    
      rowhi += image->pitch;
      rowlo -= image->pitch;
    }
    free(tmpbuf);
    // ...
    

    Darüber steht ein Kommentar: "GL surfaces are upsidedown and RGB, not BGR :-)"
    Wenn ich den Teil beim Texturenladen weglassen würde, dann wären die Farben anders.(Wenn ich ein Rotes Bild anzeigen will, wird es Blau angezeigt)

    Gut, ich habe das so aufgefasst: Das Bild wird geladen, und dann müssen für OpenGL die Farbkanäle "umgeschaltet" werden. Zum Beispiel würde aus einem Roten Bild:
    R = 255; G = 0; B = 0;
    ein R = 0; G = 0; B = 255; werden.
    Aus RGB werde BGR 😛

    Also dreht dieser Codeteil die Werte der Kanäle entsprechend um.
    Aber ich verstehe ihn nicht. Was genau geht da vor sich, in den beiden loops, das ein richtiges Anzeigen zur Folge hat? Was ist rowhi und rowlo bzw. image->pitch und image->pixels ("man SDL_Surface" gibt leider nicht genug Informationen dazu :/)

    Vlt. nimmt sich ja hier jemand die Zeit, und erklärt das kurz 🙂

    Eine kurze Frage: Macht es Sinn SDL mit OpenGL zu verwenden? Oder ist da diese GLAUX (was auch immer) bzw. GLUT besser geeignet für Spiele?


Log in to reply