CARL
      VON
OSSIETZKY
            Texture-Mapping

            Johannes Diemke

            ¨
            Ubung im Modul OpenGL mit Java
            Wintersemester 2010/2011
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
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
             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
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
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 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
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 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
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
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
                    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
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
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
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
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

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 Oberfl¨chen durch Bilder a Johannes Diemke OpenGL mit Java WiSe 2010 / 2011 2/18
  • 3.
    Texture-Mapping Teekanne mit Texturen Johannes Diemke OpenGL mit Java WiSe 2010 / 2011 3/18
  • 4.
    Texture-Mapping Reflection-Mapping in Terminator2 (1991) Johannes Diemke OpenGL mit Java WiSe 2010 / 2011 4/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 Texturenauf 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 dieBilddaten 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 dieBilddaten 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 JOGL2.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 helfendie 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