Texturen

Beispiel

Projekt herunterladen

Texturen werden normalerweise eingesetzt, um den Detailreichtum einer Szene zu erhöhen, ohne dies geometrisch modellieren zu müssen.

Mit Texturen zeichnen

OpenGL unterstützt ein-, zwei-  und dreidimensionale Texturen. Wir möchten uns mit den zweidimensionalen Texturen, also Bildern, beschäftigen. In der Computergrafik bestehen Bilder meist aus einem rechteckigen Raster von Bildpunkten (Pixeln = Picture Elements), die jeweils eine Farbe (z.B. RGB) und eventuell auch einen Transparenzwert (A = Alpha) besitzen. Bei Texturen spricht man statt von Pixeln von Texeln.

Aufbau einer Textur

Um mit einer Textur zu arbeiten, muss diese zunächst in den Grafikkartenspeicher geladen werden. Danach kann man für jeden zu setzenden Vektor festlegen, welche Texturkoordinaten (s,t) für ihn gelten. Die Textur wird dann diesen Koordinaten entspechend gestreckt oder gestaucht auf das Objekt gelegt.

Angenommen, die Textur wäre schon in der Grafikkarte, dann könnten wir sie z.B. so auf ein Quadrat aufbringen:

glBegin(GL_QUADS);

    glTexCoord2f(0, 0);  // Texturkoordinate links unten
    glVertex2f(-1, -1);  // Punkt links unten setzen

    glTexCoord2f(1, 0);  // Texturkoordinate rechts unten
    glVertex2f( 1, -1);  // Punkt rechts unten setzen

    glTexCoord2f(1, 1);  // Texturkoordinate rechts oben
    glVertex2f( 1,  1);  // Punkt rechts oben setzen

    glTexCoord2f(0, 1);  // Texturkoordinate links oben
    glVertex2f(-1,  1);  // Punkt links oben setzen

glEnd();

Texturspeicher

OpenGL verwaltet den Bildspeicher einer Textur als lineares Array. Um die Textur in die Grafikkarte zu laden, benötigen wir also alle Pixel hintereinander in einem eindimensionalen Array (siehe Bild).

Linearer Texturspeicher

Um zum Beispiel ein Grauwertbild in die Karte hochzuladen, könnten wir so vorgehen:

    // OpenGL Texturen aktivieren
    glEnable(GL_TEXTURE_2D);

    // Eine Textur in Karte erzeugen
    GLuint textureNumber;
    glGenTextures(1, &textureNumber);

    // Mit unserer erzeugten Textur arbeiten
    glBindTexture(GL_TEXTURE_2D, textureNumber);

    // Lineare Interpolation der Texturpixel zum Vergrößern und
    // Verkleinern verwenden (andere Parameter auf Standard belasen)
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);

    // Puffer initialisieren
    GLubyte buffer[TEXTURE_WIDTH*TEXTURE_HEIGHT];
    for (unsigned int j = 0; j < TEXTURE_HEIGHT; j++)
    {
        for (unsigned int i = 0; i < TEXTURE_WIDTH; i++)
        {
            buffer[j*TEXTURE_WIDTH+i] = (i*j)%256;
        }
    }

    // Textur in die Grafikkarte hochladen
    glTexImage2D(GL_TEXTURE_2D,     // 2D Textur
                 0,                 // Detailsstufe (für Mipmaps)
                 1,                 // Farbkomponenten (1 für Grauwerte)
                 TEXTURE_WIDTH,     // Breite
                 TEXTURE_HEIGHT,    // Höhe
                 0,                 // Rand
                 GL_LUMINANCE,      // Pixel-Format (Grauwerte)
                 GL_UNSIGNED_BYTE,  // Datentyp der Komponenten (0 bis 255)
                 buffer);           // Pixel-Puffer

Die Texturnummer (bzw. der Texturname) sollte natürtlich nicht lokal deklariert sein, denn mit

    // Eine Textur aus der Karte löschen
    glDeleteTextures(1, &textureNumber);

Muss die Textur am Ende des Programms wieder aus der Karte gelöscht werden.

zurück