Grundlagen - Eine Textur ist ein Bild, das auf eine Oberfläche einer Geometrie aufgebracht ist - erlauben eine realistischere Darstellung von Oberflächen - können auf alle Primitive, nicht nur Polygone angewandt werden - können ein-, zwei- oder dreidimensional sein - können direkt auf die Oberfläche gezeichnet werden und deren Farbe ersetzen oder sie modulieren - Anwendungsbeispiele: - Natürliche Darstellung von Oberflächen wie Holz, Stein, etc - Environment Mapping 1
Allgmeines Vorgehen bei der Texturierung - Erstellen eines Textur-Objekts - Spezifikation einer Textur für das Objekt - Festlegung, wie die Textur auf einzelnen Pixel angewandt werden soll - Aktivieren des Textur-Mappings - Zeichnen der Szene - Definition der Texturkoordinaten - Definition der geometrischen Koordinaten 2
Erstellen von Textur-Objekten void glgentextures(glsizei n, GLuint *texnames); - Allokiert Speicherplatz für n Textur-Objekte - Ein Textur-Objekt wird über einen unsigned integer Wert referenziert - Die zurückgegebenen Werte müssen nicht zusammenhängend sein - Der Speicherplatz für die wird erst initialisiert, wenn die Textur an den Speicherplatz gebunden wird. 3
Überprüfung von Textur-Objekten GLboolean glistexture(gluint texname); - Überprüft, ob an den unsigned integer Wert eine Textur gebunden ist - Rückgabewert: - GL_TRUE wenn an den Wert eine Textur gebunden ist, die nicht vorher gelöscht wurde - GL_FALSE wenn der Wert 0 ist oder keine Textur an ihn gebunden ist 4
Löschen von Textur-Objekten void gldeletetextures(glsizei n, const GLuint *texnames); - Gibt den Speicherplatz für die n Textur-Objekte, die in dem Array angegeben sind, wieder frei - Beim Versuch, nicht belegte Textur-Objekte zu löschen, wird die Operation nicht ausgeführt und der Löschversuch ignoriert. Es wird keine Fehlermeldung generiert. - Wird eine aktuell gebundene Textur (siehe glbindtexture() ) gelöscht, wird die Verwendung von Textur-Objekten beenden 5
Binden von Textur-Objekten / Verwalten mehrerer Textur-Objekte void glbindtexture(glenum target, GLuint texname); - Bindet und initialisiert ein Textur-Objekt - Ist das Textur-Objekt noch nicht generiert, wird es auch erstellt - Beim Binden an das Textur-Objekt 0 wird die Verwendung von Textur-Objekten beendet -target kann die Werte GL_TEXTURE_1D, GL_TEXTURE_2D, GL_TEXTURE_3D oder GL_TEXTURE_CUBE_MAP (ab Version 1.3) annehmen. - Durch diesen Mechanismus (verfügbar ab OpenGL Version 1.1) wird die jeweils aktive Textur festgelegt. 6
Spezifikation von Textur-Parametern void gltexparameteri(glenum target, GLenum pname, GLint param); void gltexparameterf(glenum target, GLenum pname, GLfloat param); void gltexparameteriv(glenum target, GLenum pname, GLint *param); void gltexparameterfv(glenum target, GLenum pname, GLfloat *param); - Spezifiziert den durch pname angegebenen Parameter -target kann die Werte GL_TEXTURE_1D, GL_TEXTURE_2D, GL_TEXTURE_3D oder GL_TEXTURE_CUBE_MAP annehmen 7
Texture Mapping Einige Textur-Parameter und ihre Werte Parameter Mögliche Werte GL_TEXTURE_WRAP_S, GL_CLAMP, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE, GL_TEXTURE_WRAP_R GL_CLAMP_TO_BORDER, GL_REPEAT, GL_MIRRORED_REPEAT GL_TEXTURE_MAG_FILTER GL_TEXTURE_MIN_FILTER GL_TEXTURE_BORDER_COLOR GL_NEAREST, GL_LINEAR GL_NEAREST, GL_LINEAR (und andere) RGBA-Werte 8
Definition des Zeichenmodus bei der Texturierung - Nutzung der Methoden zur Spezifikation der Textur-Umgebung void gltexenvi(glenum target, GLenum pname, GLint param); void gltexenvf(glenum target, GLenum pname, GLfloat param); void gltexenviv(glenum target, GLenum pname, GLint *param); void gltexenvfv(glenum target, GLenum pname, GLfloat *param); 9
Definition des Zeichenmodus bei der Texturierung -Ein target Wert von GL_TEXTURE_ENV und der Parameter-Wert GL_TEXTURE_ENV_MODE spezifizieren den Zeichenmodus - GL_DECAL Blending von Oberflächen- und Texturfarbe gemäß dem Alpha-Wert der Textur-Farbe - GL_REPLACE Ersetzt die Oberflächenfarbe durch die Texturfarbe - GL_MODULATE Multipliziert die Oberflächenfarbe mit der Texturfarbe - GL_BLEND Blending jeder Komponente der Oberflächen- und Texturfarbe mit der entsprechenden Komponente der Texturfarbe - GL_ADD Addiert Oberflächen- und Texturfarbe - GL_COMBINE Kombiniert die Farben gemäß einem extra zu spezifizierenden Kombinations-Modus 10
Spezifikation eines Textur-Bildes für ein Textur-Objekt - sind ein-, zwei- oder dreidimensionale Bilder - Sie enthalten meist RGBA-Werte - Sie können auch Modulations-Konstanten oder Tiefenwerte enthalten - Spezifikation der Objekte mittels void glteximage1d(); void glteximage2d(); oder void glteximage3d(); 11
Definition eines zweidimensionalen Textur-Images void glteximage2d(glenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *texels); - Definiert das Texturobjekt mit den entsprechenden Parametern - Die eigentliche Textur ist in dem Array texels enthalten. 12
Parameter eines Textur-Images GLenum target - Beschreibt den Typ der Textur - Mögliche Werte (Auswahl): GL_TEXTURE_2D GL_TEXTURE_CUBE_MAP_POSITIVE_X GL_TEXTURE_CUBE_MAP_NEGATIVE_X GL_TEXTURE_CUBE_MAP_POSITIVE_Y GL_TEXTURE_CUBE_MAP_NEGATIVE_Y GL_TEXTURE_CUBE_MAP_POSITIVE_Z GL_TEXTURE_CUBE_MAP_NEGATIVE_Z 13
Parameter eines Textur-Images GLint level - Wird benötigt bei der Darstellung der Textur in mehreren Levels of Detail (Mip-Mapping) - Spezifiziert den Level of Detail, dem die Textur zugeordnet werden soll - Wird nur eine Textur spezifiziert, so ist der level 0 14
Parameter eines Textur-Images GLint internalformat - Beschreibt, welche Komponenten des Bildes auf die Textur angewendet werden sollen - Mögliche Werte (Auswahl): GL_ALPHA GL_LUMINANCE GL_LUMINANCE_ALPHA GL_RGB GL_RGBA GL_R3_G3_B2 GL_COMPRESSED_LUMINANCE_ALPHA GL_COMPRESSED_RGBA 15
Parameter eines Textur-Images GLsizei width, GLsizei height, GLint border - Geben Breite und Höhe der Textur sowie das Vorhandensein eines möglichen Randes an -border kann die Werte 0 (kein Rand) oder 1 annehmen -width und height müssen von der form 2 m +2border sein - Der Wert von m kann für Breite und Höhe unterschiedlich sein - Die Maximalgröße einer Textur ist implementierungsabhängig, ist aber mindestens 64x64 Texels (bzw. 66*66 mit Rand). -GLenum format und GLenum type beschreiben Pixelformat und Datentyp wie bei gldrawpixels() - Formatbeispiele: GL_RGBA, GL_LUMINANCE_ALPHA - Datentypen: GL_BYTE, GL_UNSIGNED_BYTE, GL_SHORT 16
Setzen der Texturkoordinaten - Texturkoordinaten werden parallel zum Zeichnen der Geometrie gesetzt - Eine gesetzte Texturkoordinate ist gültig für alle anschließend gezeichneten Vertices - Das Setzen der Texturkoordinaten geschieht analog zum Setzen der Geometrie: void gltexcoord{1234}{sifd}(type coords); bzw. void gltexcoord{1234}{sifd}v(type *coords); 17
Setzen der Texturkoordinaten - Beispiel: glbegin(gl_quads); gltexcoord2f(0.0, 0.0); glvertex3f(-2.0, -1.0, 0.0); gltexcoord2f(0.0, 1.0); glvertex3f(-2.0, 1.0, 0.0); gltexcoord2f(1.0, 1.0); glvertex3f(0.0, 1.0, 0.0); gltexcoord2f(1.0, 0.0); glvertex3f(0.0, -1.0, 0.0); glend(); 18
Alignment bei Textur-Operationen void glpixelstorei(gl_pack_alignment, GLint value); void glpixelstorei(gl_unpack_alignment, GLint value); - Legt das Byte-Alignment der einzelnen Zeilen der Textur fest (analog zum Bitmap- und Pixel-Zeichnen) - Wenn die einzelnen Zeilen im Speicher nicht auf bestimmte Werte aufgefüllt werden, ist ein value von 1 sinnvoll 19
Aktivieren / Deaktivieren der Texturierung glenable(glenum textureformat); - Aktiviert die Texturierung in dem entsprechenden Format (z.b. GL_TEXTURE_2D) gldisable(glenum textureformat); - Deaktiviert entsprechend die Texturierung 20
Beispielprogramm - checker.cpp (Siehe Website) 21
Beispielprogramm - texbind.cpp (Siehe Website) 22
Skalieren eines Textur-Bildes int gluscaleimage(glenum format, GLint widthin, GLint heightin GLenum typein, const void *datain, GLint widthout, GLint heightout, GLenum typeout, void *dataout); - Erlaubt die Skalierung eines Bildes, um durch Interpolation der Texel die vorgeschriebene Größe zu erhalten -format, typein und typout beschreiben wiederum Pixelformat und Datentyp wie bei gldrawpixels() - Der zum Schreiben der Daten benötigte Speicher muss vorher reserviert werden - Rückgabewerte: 0 im Erfolgsfall, ansonsten ein GLU Fehlercode 23
Lesen einer Textur aus dem Framebuffer void glcopyteximage2d(glenum target, GLint level, GLint internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border); - Liest den Framebuffer an der Stelle x, y (linke untere Ecke) aus und kopiert die Werte in den Texturspeicher - Alle anderen Parameter haben genau die gleiche Funktion wie bei glteximage2d() 24
Lesen einer Textur aus einer Bilddatei - Nutzung einer Funktion aus der glm-bibliothek GLubyte* glmreadppm(char* filename, int* width, int* height); - Liest eine Datei im PPM-Format (Portable Pixel Map) - Gibt die Werte als Array of unsigned bytes zurück - Gibt die Breite und Höhe des gelesenen Bildes in den Parametern zurück - Format einer PPM-Datei: P6 # comment width height max_value rgbrgbrgb... - Erzeugung einer PPM-Datei z.b. mittels IrfanView 25
Beispielprogramm - checker_image.cpp (Siehe Website) 26
Aufgabe - Was müssen Sie tun, um die Datei Segeln.ppm (in der gepackten Datei "checker_image.tar.gz" enthalten) als Textur auf eine Oberfläche mappen zu können? 27
Automatische Generierung von Textur-Koordinaten void gltexgen{ifd}(glenum coord, GLenum pname, TYPE param); void gltexgen{ifd}v(glenum coord, GLenum pname, TYPE *param); - Legt die Funktion fest, nach der die Textur-Koordinaten automatisch berechnet werden - Die zu berechnende Textur-Koordinate wird durch den Parameter coord festgelegt - GL_S, GL_T, GL_R, GL_Q 28
Parameternamen bei der Generierung von Textur-Koordinaten -pname kann die Werte GL_TEXTURE_GEN_MODE, GL_OBJECT_PLANE oder GL_EYE_PLANE annehmen -GL_TEXTURE_GEN_MODE legt die Funktion zur Erstellung der Textur-Koordinaten fest - Entsprechende Parameterwerte sind folgende Integer-Konstanten: - GL_OBJECT_LINEAR - GL_EYE_LINEAR - GL_SPHERE_MAP - GL_REFLECTION_MAP - GL_NORMAL_MAP 29
Parameternamen bei der Generierung von Textur-Koordinaten -pname kann die Werte GL_TEXTURE_GEN_MODE, GL_OBJECT_PLANE oder GL_EYE_PLANE annehmen - Bei Verwendung des Parameternamens GL_OBJECT_PLANE oder GL_EYE_PLANE legt der Parameter die Ebenengleichung der betreffenden Ebene fest - Beispiel: static GLfloat objplane[] = {1.0, 1.0, 1.0, 0.0}; gltexgeni(gl_s, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR); gltexgenfv(gl_s, GL_OBJECT_PLANE, objplane); 30
Beispielprogramm - texgen.cpp (Siehe Website) 31
Beispielprogramm - NateRobinsTexture.cpp (Siehe Website) 32
Mip-Mapping - Textur-Objekte können in verschiedenen Levels of Detail gespeichert werden - Bei weit entfernten texturierten Objekten muß die Textur weniger detailliert sein als bei näheren - Zu diesem Zweck können zur Texturierung eine Reihe von unterschiedlicher Größe verwendet werden, welche die unterschiedlichen Levels of Detail darstellen - Dazu wird einer Textur mittels glteximage2d() für jeden Level of Detail ein eigenes Bild zugewiesen - Der höchste Mip-Map-Level beinhaltet die Textur mit der geringsten Auflösung 33
Mip-Mapping Beispielprogramm - mipmap.cpp (Siehe Website) 34
Mip-Mapping Generierung aller Mipmap-Levels aus einem Bild int glubuild{1 2}DMipmaps (GLenum target, GLint imageformat, GLint width, [GLint height], GLenum pixelformat, GLenum storagetype, const void *data); - Erzeugt aus einem Bild der Größe width, height die Textur- Bilder aller Mipmap-Levels - Skaliert das Bild auf die nächste Zweierpotenz - Generiert anschließend alle Mipmap-Levels bis zur Textur-Größe 1x1 35
Mip-Mapping Beispielprogramm - mipmap_image.cpp (Siehe Website) 36