Texture-Mappingtrigger/content/opengl/opengl... · OpenGL ben otigt die Bilddaten in Form eines Bu er-Objektes ByteBuffer buffer = ByteBuffer.allocateDirect ... 3D Math Primer for

  • 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/