+ All Categories
Home > Documents > 2010-JOGL-09-Texture-Mapping

2010-JOGL-09-Texture-Mapping

Date post: 26-Jun-2015
Category:
Upload: johannes-diemke
View: 280 times
Download: 0 times
Share this document with a friend
18
C A R L V ON O SS I ET Z KY Texture-Mapping Johannes Diemke ¨ Ubung im Modul OpenGL mit Java Wintersemester 2010/2011
Transcript
Page 1: 2010-JOGL-09-Texture-Mapping

C A R LV O N

O S S I E T Z K Y

Texture-Mapping

Johannes Diemke

Ubung im Modul OpenGL mit JavaWintersemester 2010/2011

Page 2: 2010-JOGL-09-Texture-Mapping

Texture-Mapping

Grundlagen

Graphische Primitiven werden mit Bildern versehen

Eingefuhrt von Dr. Edwin Catmull (1974)

Texture-Mapping ermoglicht nahezu realistische Szenen

I Reflection-MappingI Bump-MappingI . . .

Graphikkarte wird entlastet

I Keine komplexe Geometrie notwendigI Details werden in Texturen verlagertI Darstellung komplizierter Oberflachen durch Bilder

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

Page 3: 2010-JOGL-09-Texture-Mapping

Texture-Mapping

Teekanne mit Texturen

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

Page 4: 2010-JOGL-09-Texture-Mapping

Texture-Mapping

Reflection-Mapping in Terminator 2 (1991)

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

Page 5: 2010-JOGL-09-Texture-Mapping

Texture-Mapping

Texturen in OpenGLMussten fruher POT (Power-Of-Two) sein

I Breite und Hohe sind 2er-PotenzenI Moderne Hardware kann mit NPOT (Non-Power-Of-Two) Texturen

umgehen

Herkunft der Texturdaten

I Bild vom SekundarspeicherI Prozedural im Primarspeicher

Mussen uber spezielle OpenGL-Befehle der Graphikkarte ubergebenwerden

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

Page 6: 2010-JOGL-09-Texture-Mapping

Texture-Mapping

Einschub: Textur-ZustandUmfasst fur das Texture-Mapping relevante Eigenschaften

I TexturI FilterI Wrap-Mode

Textur-Objekte

Textur-Zustand kann an Textur-Objekte gebunden werden

Ermoglicht schnelles Wechseln zwischen Textur-Objekten und denan ihnen gebundenen Eigenschaften

Werden durch einen Integer identifziert

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

Page 7: 2010-JOGL-09-Texture-Mapping

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 uber seine ID

gl.glBindTexture(GL2.GL_TEXTURE_2D, textureId);

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

Page 8: 2010-JOGL-09-Texture-Mapping

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

Page 9: 2010-JOGL-09-Texture-Mapping

Texture-Mapping

Verwenden von Textur-Objekten

Texture-Mapping muss zunachst eingeschaltet werden

Identifikation von Textur-Objekten geschieht uber 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

Page 10: 2010-JOGL-09-Texture-Mapping

Texture-Mapping

Abbilden von Texturen auf Geometrie

Bei eingeschaltetem Texture-Mapping wendet OpenGL die aktuelleTextur auf jedes Primitiv an

Texturkoordinaten spezifizieren wie die Textur auf die Geometrieabgebildet wird

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

Page 11: 2010-JOGL-09-Texture-Mapping

Texture-Mapping

Wo kommen die Bilddaten her?

Einlesen uber 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<width; x++)

for(int y=0; y < height; y++) {

temp[x + (y * width)] = packedPixels[x + ((height - 1 - y) * width)];

}

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

Page 12: 2010-JOGL-09-Texture-Mapping

Texture-Mapping

Wo kommen die Bilddaten her? (Forts.)

OpenGL benotigt 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

Page 13: 2010-JOGL-09-Texture-Mapping

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

Page 14: 2010-JOGL-09-Texture-Mapping

Secondary-Color

Problem

Texture-Mapping fuhrt bei beleuchteter Geometrie zu ungewolltenEffektenTexture-Environment ist i. A. auf GL MODULATE gesetzt

I Beleuchtete Geometrie wird mit der Texture-Map kombiniertI Reduziert die Sichtbarkeit der Specular-Highlights

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

Page 15: 2010-JOGL-09-Texture-Mapping

Secondary-Color

LosungDie spiegelnde Komponente beim Shading addieren

I Wird Secondary-Specular-Color genanntI Kann automatisch von OpenGL durchgefuhrt 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

Page 16: 2010-JOGL-09-Texture-Mapping

Texture-Mapping

Bei Problemen helfen die folgenden Fragen

Sind fur 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

Page 17: 2010-JOGL-09-Texture-Mapping

Literatur

� Dave ShreinerOpenGL Programming Guidehttp://www.opengl-redbook.com/

� Richard S. Wright, Benjamin Lipchak und Nicholas HaemelOpenGL SuperBibelhttp://www.starstonesoftware.com/OpenGL/

� Randi J. RostOpenGL Shading Languagehttp://www.3dshaders.com/

� Tomas Akenine-Moller, Eric Haines und Naty HoffmanReal-Time Renderinghttp://www.realtimerendering.com/

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

Page 18: 2010-JOGL-09-Texture-Mapping

Literatur

� Edward AngelInteractive Computer Graphicshttp://www.cs.unm.edu/˜angel/

� Gerald Farin und Dianne HansfordPractical Linear Algebrahttp://www.farinhansford.com/books/pla/

� Fletcher Dunn und Ian Parberry3D Math Primer for Graphics and Game Developmentwww.gamemath.com/

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


Recommended