Texture-Mapping

informatik.uni.oldenburg.de

Texture-Mapping

C A R L

V O N

O S S I E T Z K Y

Texture-Mapping

Johannes Diemke

Übung im Modul OpenGL mit Java

Wintersemester 2010/2011


Texture-Mapping

Grundlagen

Graphische Primitiven werden mit Bildern versehen

Eingeführt von Dr. Edwin Catmull (1974)

Texture-Mapping ermöglicht nahezu realistische Szenen

◮ Reflection-Mapping

◮ Bump-Mapping

◮ . . .

Graphikkarte wird entlastet

◮ Keine komplexe Geometrie notwendig

◮ Details werden in Texturen verlagert

◮ Darstellung komplizierter Oberflächen durch Bilder

Johannes Diemke OpenGL mit Java WiSe 2010 / 2011 2/18


Texture-Mapping

Teekanne mit Texturen

Johannes Diemke OpenGL mit Java WiSe 2010 / 2011 3/18


Texture-Mapping

Reflection-Mapping in Terminator 2 (1991)

Johannes Diemke OpenGL mit Java WiSe 2010 / 2011 4/18


Texture-Mapping

Texturen in OpenGL

Mussten früher POT (Power-Of-Two) sein

◮ Breite und Höhe sind 2er-Potenzen

◮ Moderne Hardware kann mit NPOT (Non-Power-Of-Two) Texturen

umgehen

Herkunft der Texturdaten

◮ Bild vom Sekundärspeicher

◮ Prozedural im Primärspeicher

Müssen über spezielle OpenGL-Befehle der Graphikkarte übergeben

werden

Johannes Diemke OpenGL mit Java WiSe 2010 / 2011 5/18


Texture-Mapping

Einschub: Textur-Zustand

Umfasst für das Texture-Mapping relevante Eigenschaften

◮ Textur

◮ Filter

◮ Wrap-Mode

Textur-Objekte

Textur-Zustand kann an Textur-Objekte gebunden werden

Ermöglicht schnelles Wechseln zwischen Textur-Objekten und den

an ihnen gebundenen Eigenschaften

Werden durch einen Integer identifziert

Johannes Diemke OpenGL mit Java WiSe 2010 / 2011 6/18


Texture-Mapping

Textur-Objekte (Forts.)

Erzeugen eines Textur-Objektes

private int genTexture(GL2 gl) {

final int[] tmp = new int[1];

gl.glGenTextures(1, tmp, 0);

return tmp[0];

}

Binden eines Textur-Objektes über seine ID

gl.glBindTexture(GL2.GL_TEXTURE_2D, textureId);

Johannes Diemke OpenGL mit Java WiSe 2010 / 2011 7/18


Texture-Mapping

Textur-Objekte (Forts.)

Erzeugen, Binden und Konfigurieren des Textur-Zustandes

int textureId = genTexture(gl);

gl.glBindTexture(GL2.GL_TEXTURE_2D, textureId);

// texture filter

gl.glTexParameteri(GL2.GL_TEXTURE_2D, GL2.GL_TEXTURE_MAG_FILTER, GL2.GL_LINEAR);

gl.glTexParameteri(GL2.GL_TEXTURE_2D, GL2.GL_TEXTURE_MIN_FILTER, GL2.GL_LINEAR);

// texture wrap mode

gl.glTexParameteri(GL2.GL_TEXTURE_2D, GL2.GL_TEXTURE_WRAP_S,

GL2.GL_CLAMP_TO_EDGE);

gl.glTexParameteri(GL2.GL_TEXTURE_2D, GL2.GL_TEXTURE_WRAP_T,

GL2.GL_CLAMP_TO_EDGE);

// set image data

gl.glTexImage2D(GL2.GL_TEXTURE_2D, 0, GL2.GL_RGBA, width, height, 0,

GL2.GL_RGBA, GL2.GL_UNSIGNED_BYTE, buffer);

Johannes Diemke OpenGL mit Java WiSe 2010 / 2011 8/18


Texture-Mapping

Verwenden von Textur-Objekten

Texture-Mapping muss zunächst eingeschaltet werden

Identifikation von Textur-Objekten geschieht über die ID

gl.glEnable(GL2.GL_TEXTURE_2D);

gl.glBindTexture(GL2.GL_TEXTURE_2D, textureId);

gl.glBegin(GL2.GL_QUADS);

gl.glTexCoord2f(0.0f, 0.0f); gl.glVertex3f(-1.0f, -1.0f, 1.0f);

gl.glTexCoord2f(1.0f, 0.0f); gl.glVertex3f( 1.0f, -1.0f, 1.0f);

gl.glTexCoord2f(1.0f, 1.0f); gl.glVertex3f( 1.0f, 1.0f, 1.0f);

gl.glTexCoord2f(0.0f, 1.0f); gl.glVertex3f(-1.0f, 1.0f, 1.0f);

gl.glEnd();

Johannes Diemke OpenGL mit Java WiSe 2010 / 2011 9/18


Texture-Mapping

Abbilden von Texturen auf Geometrie

Bei eingeschaltetem Texture-Mapping wendet OpenGL die aktuelle

Textur auf jedes Primitiv an

Texturkoordinaten spezifizieren wie die Textur auf die Geometrie

abgebildet wird

Johannes Diemke OpenGL mit Java WiSe 2010 / 2011 10/18


Texture-Mapping

Wo kommen die Bilddaten her?

Einlesen über die Klasse ImageIO

FileInputStream fileInputStream = new FileInputStream(new File(filename));

BufferedImage bufferedImage = ImageIO.read(fileInputStream);

width = bufferedImage.getWidth();

height = bufferedImage.getHeight();

// store pixels in TYPE_INT_ARGB format in packedPixels array

int[] packedPixels = new int[width * height];

bufferedImage.getRGB(0, 0, width, height, packedPixels, 0, width);

// OpenGL expects textures to be flipped upside down

temp = new int[width * height];

for(int x=0; x


Texture-Mapping

Wo kommen die Bilddaten her? (Forts.)

OpenGL benötigt die Bilddaten in Form eines Buffer-Objektes

ByteBuffer buffer = ByteBuffer.allocateDirect(temp.length * 4);

buffer.order(ByteOrder.nativeOrder());

// convert the image data to the specified format

buffer.put(convertToRGBA(temp));

buffer.rewind();

// load the image data into a texture

gl.glTexImage2D(GL.GL_TEXTURE_2D, 0, GL.GL_RGBA, width, height, 0, GL.GL_RGBA,

GL.GL_UNSIGNED_BYTE, buffer);

Johannes Diemke OpenGL mit Java WiSe 2010 / 2011 12/18


Texture-Mapping

Texture-Mapping in JOGL 2.0

JOGL 2.0 bietet Hilfsklassen zum Laden von Texturen

Vereinfacht das Texture-Mapping extrem

texture = TextureIO.newTexture (new File ("deathstar.png"), false);

texture.setTexParameteri(GL2.GL_TEXTURE_MAG_FILTER, GL2.GL_LINEAR);

texture.setTexParameteri(GL2.GL_TEXTURE_MIN_FILTER, GL2.GL_LINEAR);

texture.setTexParameterf(GL2.GL_TEXTURE_WRAP_S, GL2.GL_CLAMP_TO_EDGE);

texture.setTexParameterf(GL2.GL_TEXTURE_WRAP_T, GL2.GL_CLAMP_TO_EDGE);

texture.setTexParameteri(GL2.GL_GENERATE_MIPMAP, GL2.GL_TRUE);

texture.bind();

deathstar.draw();

Johannes Diemke OpenGL mit Java WiSe 2010 / 2011 13/18


Secondary-Color

Problem

Texture-Mapping führt bei beleuchteter Geometrie zu ungewollten

Effekten

Texture-Environment ist i. A. auf GL MODULATE gesetzt

◮ Beleuchtete Geometrie wird mit der Texture-Map kombiniert

◮ Reduziert die Sichtbarkeit der Specular-Highlights

Johannes Diemke OpenGL mit Java WiSe 2010 / 2011 14/18


Secondary-Color

Lösung

Die spiegelnde Komponente beim Shading addieren

◮ Wird Secondary-Specular-Color genannt

◮ Kann automatisch von OpenGL durchgeführt werden

gl.glLightModeli(GL.GL_LIGHT_MODEL_COLOR_CONTROL,GL.GL_SEPARATE_SPECULAR_COLOR);

gl.glLightModeli(GL.GL_LIGHT_MODEL_COLOR_CONTROL,GL.GL_SINGLE_COLOR);

Johannes Diemke OpenGL mit Java WiSe 2010 / 2011 15/18


Texture-Mapping

Bei Problemen helfen die folgenden Fragen

Sind für jeden Vertex die Texturkoordinaten gesetzt?

Ist die Dimension der Textur korrekt?

Wurde die Datei gefunden?

Sind die Filter richtig gesetzt?

Ist das Textur-Mapping eingeschaltet?

Johannes Diemke OpenGL mit Java WiSe 2010 / 2011 16/18


Literatur





Dave Shreiner

OpenGL Programming Guide

http://www.opengl-redbook.com/

Richard S. Wright, Benjamin Lipchak und Nicholas Haemel

OpenGL SuperBibel

http://www.starstonesoftware.com/OpenGL/

Randi J. Rost

OpenGL Shading Language

http://www.3dshaders.com/

Tomas Akenine-Möller, Eric Haines und Naty Hoffman

Real-Time Rendering

http://www.realtimerendering.com/

Johannes Diemke OpenGL mit Java WiSe 2010 / 2011 17/18


Literatur




Edward Angel

Interactive Computer Graphics

http://www.cs.unm.edu/˜angel/

Gerald Farin und Dianne Hansford

Practical Linear Algebra

http://www.farinhansford.com/books/pla/

Fletcher Dunn und Ian Parberry

3D Math Primer for Graphics and Game Development

www.gamemath.com/

Johannes Diemke OpenGL mit Java WiSe 2010 / 2011 18/18

Weitere Magazine dieses Users
Ähnliche Magazine