Vorstellung des Roboterfußball-Teams TORF (Vortrag)
2010-JOGL-09-Texture-Mapping
1. CARL
VON
OSSIETZKY
Texture-Mapping
Johannes Diemke
¨
Ubung im Modul OpenGL mit Java
Wintersemester 2010/2011
2. Texture-Mapping
Grundlagen
Graphische Primitiven werden mit Bildern versehen
Eingef¨hrt von Dr. Edwin Catmull (1974)
u
Texture-Mapping erm¨glicht nahezu realistische Szenen
o
Reflection-Mapping
Bump-Mapping
...
Graphikkarte wird entlastet
Keine komplexe Geometrie notwendig
Details werden in Texturen verlagert
Darstellung komplizierter Ober߬chen durch Bilder
a
Johannes Diemke OpenGL mit Java WiSe 2010 / 2011 2/18
5. Texture-Mapping
Texturen in OpenGL
Mussten fr¨her POT (Power-Of-Two) sein
u
Breite und H¨he sind 2er-Potenzen
o
Moderne Hardware kann mit NPOT (Non-Power-Of-Two) Texturen
umgehen
Herkunft der Texturdaten
Bild vom Sekund¨rspeicher
a
Prozedural im Prim¨rspeicher
a
M¨ssen uber spezielle OpenGL-Befehle der Graphikkarte ubergeben
u ¨ ¨
werden
Johannes Diemke OpenGL mit Java WiSe 2010 / 2011 5/18
6. Texture-Mapping
Einschub: Textur-Zustand
Umfasst f¨r das Texture-Mapping relevante Eigenschaften
u
Textur
Filter
Wrap-Mode
Textur-Objekte
Textur-Zustand kann an Textur-Objekte gebunden werden
Erm¨glicht schnelles Wechseln zwischen Textur-Objekten und den
o
an ihnen gebundenen Eigenschaften
Werden durch einen Integer identifziert
Johannes Diemke OpenGL mit Java WiSe 2010 / 2011 6/18
7. 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
8. 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
9. Texture-Mapping
Verwenden von Textur-Objekten
Texture-Mapping muss zun¨chst eingeschaltet werden
a
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
10. 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
11. 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
12. Texture-Mapping
Wo kommen die Bilddaten her? (Forts.)
OpenGL ben¨tigt die Bilddaten in Form eines Buffer-Objektes
o
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
13. 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
14. Secondary-Color
Problem
Texture-Mapping f¨hrt bei beleuchteter Geometrie zu ungewollten
u
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
15. Secondary-Color
L¨sung
o
Die spiegelnde Komponente beim Shading addieren
Wird Secondary-Specular-Color genannt
Kann automatisch von OpenGL durchgef¨hrt werden
u
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
16. Texture-Mapping
Bei Problemen helfen die folgenden Fragen
Sind f¨r jeden Vertex die Texturkoordinaten gesetzt?
u
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
17. 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
o
Real-Time Rendering
http://www.realtimerendering.com/
Johannes Diemke OpenGL mit Java WiSe 2010 / 2011 17/18
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