Texturen werden normalerweise eingesetzt, um den Detailreichtum einer Szene zu erhöhen, ohne dies geometrisch modellieren zu müssen.
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.
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:
glTexCoord2f(0, 0);
glTexCoord2f(1, 0);
glTexCoord2f(1, 1);
glVertex2f( 1, 1);
glTexCoord2f(0, 1);
glEnd();
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).
Um zum Beispiel ein Grauwertbild in die Karte hochzuladen, könnten wir so vorgehen:
glEnable(GL_TEXTURE_2D);
GLuint textureNumber;
glGenTextures(1, &textureNumber);
glBindTexture(GL_TEXTURE_2D, textureNumber);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
{
{
buffer[j*TEXTURE_WIDTH+i] = (i*j)%256;
}
}
glTexImage2D(GL_TEXTURE_2D,
0,
1,
TEXTURE_WIDTH,
TEXTURE_HEIGHT,
0,
GL_LUMINANCE,
GL_UNSIGNED_BYTE,
buffer);
Die Texturnummer (bzw. der Texturname) sollte natürtlich nicht lokal deklariert sein, denn mit
glDeleteTextures(1, &textureNumber);
Muss die Textur am Ende des Programms wieder aus der Karte gelöscht werden.