If you can't read please download the document
Upload
lyngoc
View
232
Download
0
Embed Size (px)
Citation preview
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
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
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 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
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
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
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 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
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
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
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
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 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
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
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
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
http://www.opengl-redbook.com/http://www.starstonesoftware.com/OpenGL/http://www.3dshaders.com/http://www.realtimerendering.com/
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
http://www.cs.unm.edu/~angel/http://www.farinhansford.com/books/pla/