package cg; //-------------------------------------------------------------------- import javax.swing.JFrame; import com.jogamp.opengl.GL2; import com.jogamp.opengl.GLAutoDrawable; import com.jogamp.opengl.GLCapabilities; import com.jogamp.opengl.GLEventListener; import com.jogamp.opengl.GLProfile; import com.jogamp.opengl.awt.GLCanvas; import com.jogamp.opengl.glu.GLU; import com.jogamp.opengl.util.FPSAnimator; //-------------------------------------------------------------------- import java.io.File; import java.io.IOException; //-------------------------------------------------------------------- import com.jogamp.opengl.util.texture.Texture; import com.jogamp.opengl.util.texture.TextureIO; //-------------------------------------------------------------------- import com.jogamp.opengl.util.texture.TextureData; //-------------------------------------------------------------------- public class Main implements GLEventListener { private GLU glu = new GLU(); private float rtri = 0.0f; String texturdatei_name = "tree.png"; String texturPfad = "src/res/" + texturdatei_name; float texmax = 1f; /** Standard-Ansatz: */ //TextureData texture_data; //int[] texture = new int[1]; /** alternativer Ansatz (fürs Testen: der obige ↑ Schnipsel (Absatz) - auskommentieren, der untere ↓ - kommentieren) */ Texture texture_alternativ; //-------------------------------------------------------------------- public static void main(String[] args) { final GLProfile profile = GLProfile.get(GLProfile.GL2); GLCapabilities capabilities = new GLCapabilities(profile); final GLCanvas glcanvas = new GLCanvas(capabilities); final int width = 800; final int height = 600; Main m = new Main(); glcanvas.addGLEventListener(m); final JFrame frame = new JFrame ("texturierter Würfel"); frame.add(glcanvas); frame.setSize(width, height); frame.setVisible(true); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); final FPSAnimator animator = new FPSAnimator( glcanvas, 60, true ); animator.start(); } //-------------------------------------------------------------------- @Override public void init(GLAutoDrawable drawable) { GL2 gl = drawable.getGL().getGL2(); gl.glClearColor(0.000f, 0.749f, 1.000f, 1.0f); gl.glEnable( GL2.GL_DEPTH_TEST ); //Tiefentest wird aktiviert gl.glEnable(GL2.GL_ALPHA_TEST); //Alpha-Test wird aktiviert gl.glAlphaFunc(GL2.GL_GREATER, 0.5f); //nur die zu zeichende Fragmente mit dem Transparenzwert > 0.5f werden nicht verworfen //gl.glEnable(GL2.GL_BLEND); // Farbmischungsmodus wird aktiviert //gl.glBlendFunc(GL2.GL_SRC_ALPHA, GL2.GL_ONE_MINUS_SRC_ALPHA); try { //die Texturdatei muss im entpsrechenden Ordner (hier: /src/res/) des OpenGL-Projektes abgelegt sein File im = new File(texturPfad); /** Standard-Ansatz: */ //analog zum VBO-Verlauf (siehe die Folien #3) //texture_data = TextureIO.newTextureData(gl.getGLProfile(), im, false, null); //gl.glGenTextures(1, texture, 0); //gl.glBindTexture(GL2.GL_TEXTURE_2D, texture[0]); //gl.glTexImage2D(GL2.GL_TEXTURE_2D, 0, texture_data.getInternalFormat(), texture_data.getWidth(), texture_data.getHeight(), texture_data.getBorder(), texture_data.getPixelFormat(), texture_data.getPixelType(), texture_data.getBuffer()); //gl.glTexParameteri(GL2.GL_TEXTURE_2D, GL2.GL_TEXTURE_MAG_FILTER, GL2.GL_NEAREST); //gl.glTexParameteri(GL2.GL_TEXTURE_2D, GL2.GL_TEXTURE_MIN_FILTER, GL2.GL_NEAREST); //gl.glTexParameteri(GL2.GL_TEXTURE_2D, GL2.GL_TEXTURE_WRAP_R, GL2.GL_REPEAT); //gl.glTexParameteri(GL2.GL_TEXTURE_2D, GL2.GL_TEXTURE_WRAP_S, GL2.GL_CLAMP); //gl.glBindTexture(GL2.GL_TEXTURE_2D, 0); /** alternativer Ansatz (fürs Testen: der obige ↑ Schnipsel (Absatz) - auskommentieren, der untere ↓ - kommentieren) */ texture_alternativ = TextureIO.newTexture(im, true); } catch (IOException e) { e.printStackTrace(); } } //-------------------------------------------------------------------- @Override public void display(GLAutoDrawable drawable) { GL2 gl = drawable.getGL().getGL2(); gl.glClear( GL2.GL_COLOR_BUFFER_BIT | GL2.GL_DEPTH_BUFFER_BIT ); gl.glMatrixMode( GL2.GL_MODELVIEW ); gl.glLoadIdentity(); gl.glTranslatef( 0.0f, 0.0f, -6.0f); gl.glRotatef( rtri, 1.0f, 1.0f, 1.0f ); /** Standard-Ansatz: */ // Texturierung wird aktiviert //gl.glEnable(GL2.GL_TEXTURE_2D); //gl.glBindTexture(GL2.GL_TEXTURE_2D, texture[0]); /** alternativer Ansatz (fürs Testen: der obige ↑ Schnipsel (Absatz) - auskommentieren, der untere ↓ - kommentieren) */ texture_alternativ.enable(gl); texture_alternativ.bind(gl); gl.glTexParameteri(GL2.GL_TEXTURE_2D, GL2.GL_TEXTURE_MAG_FILTER, GL2.GL_NEAREST); gl.glTexParameteri(GL2.GL_TEXTURE_2D, GL2.GL_TEXTURE_MIN_FILTER, GL2.GL_NEAREST); gl.glTexParameteri(GL2.GL_TEXTURE_2D, GL2.GL_TEXTURE_WRAP_R, GL2.GL_REPEAT); gl.glTexParameteri(GL2.GL_TEXTURE_2D, GL2.GL_TEXTURE_WRAP_S, GL2.GL_CLAMP); // zu texturierendes Objekt wird gezeichnet // OpenGL-komform definiert (i.e. aüßere Seiten im Gegenuhrzeigersinn) // entspricht dem Vorgabewert GL_CCW für glFrontFace // v6----- v5 // /| /| // v1------v0| // | | | | // | v7----|-v4 // |/ |/ // v2------v3 gl.glBegin( GL2.GL_QUADS ); //gl.glColor3f( 1f,0f,0f ); //rot gl.glTexCoord2f(texmax, texmax);gl.glVertex3f( 1.0f, 1.0f, -1.0f ); // v5 Top Right (Top) gl.glTexCoord2f(0f, texmax);gl.glVertex3f( -1.0f, 1.0f, -1.0f); // v6 Top Left (Top) gl.glTexCoord2f(0f, 0f);gl.glVertex3f( -1.0f, 1.0f, 1.0f ); // v1 Bottom Left (Top) gl.glTexCoord2f(texmax, 0f);gl.glVertex3f( 1.0f, 1.0f, 1.0f ); // v0 Bottom Right (Top) //gl.glColor3f( 0f,1f,0f ); //grün gl.glTexCoord2f(texmax, texmax);gl.glVertex3f( 1.0f, -1.0f, 1.0f ); // v3 Top Right (Bottom) gl.glTexCoord2f(0f, texmax);gl.glVertex3f( -1.0f, -1.0f, 1.0f ); // v2 Top Left (Bottom) gl.glTexCoord2f(0f, 0f);gl.glVertex3f( -1.0f, -1.0f, -1.0f ); // v7 Bottom Left (Bottom) gl.glTexCoord2f(texmax, 0f);gl.glVertex3f( 1.0f, -1.0f, -1.0f ); // v4 Bottom Right (Bottom) //gl.glColor3f( 0f,0f,1f ); //blau gl.glTexCoord2f(texmax, texmax);gl.glVertex3f( 1.0f, 1.0f, 1.0f ); // v0 Top Right (Front) gl.glTexCoord2f(0f, texmax);gl.glVertex3f( -1.0f, 1.0f, 1.0f ); // v1 Top Left (Front) gl.glTexCoord2f(0f, 0f);gl.glVertex3f( -1.0f, -1.0f, 1.0f ); // v2 Bottom Left (Front) gl.glTexCoord2f(texmax, 0f);gl.glVertex3f( 1.0f, -1.0f, 1.0f ); // v3 Bottom Right (Front) //gl.glColor3f( 1f,1f,0f ); //gelb (rot + grün) gl.glTexCoord2f(texmax, texmax);gl.glVertex3f( 1.0f, -1.0f, -1.0f ); // v4 Bottom Left (Back) gl.glTexCoord2f(0f, texmax);gl.glVertex3f( -1.0f, -1.0f, -1.0f ); // v7 Bottom Right (Back) gl.glTexCoord2f(0f, 0f);gl.glVertex3f( -1.0f, 1.0f, -1.0f ); // v6 Top Right (Back) gl.glTexCoord2f(texmax, 0f);gl.glVertex3f( 1.0f, 1.0f, -1.0f ); // v5 Top Left (Back) //gl.glColor3f( 1f,0f,1f ); //lila (red + blau) gl.glTexCoord2f(texmax, texmax);gl.glVertex3f( -1.0f, 1.0f, 1.0f ); // v1 Top Right (Left) gl.glTexCoord2f(0f, texmax);gl.glVertex3f( -1.0f, 1.0f, -1.0f ); // v6 Top Left (Left) gl.glTexCoord2f(0f, 0f);gl.glVertex3f( -1.0f, -1.0f, -1.0f ); // v7 Bottom Left (Left) gl.glTexCoord2f(texmax, 0f);gl.glVertex3f( -1.0f, -1.0f, 1.0f ); // v2 Bottom Right (Left) //gl.glColor3f( 0f,1f, 1f ); //türkis (grün + blau) gl.glTexCoord2f(texmax, texmax);gl.glVertex3f( 1.0f, 1.0f, -1.0f ); // v5 Top Right (Right) gl.glTexCoord2f(0f, texmax);gl.glVertex3f( 1.0f, 1.0f, 1.0f ); // v0 Top Left (Right) gl.glTexCoord2f(0f, 0f);gl.glVertex3f( 1.0f, -1.0f, 1.0f ); // v3 Bottom Left (Right) gl.glTexCoord2f(texmax, 0f);gl.glVertex3f( 1.0f, -1.0f, -1.0f ); // v4 Bottom Right (Right) gl.glEnd(); /** Standard-Ansatz: */ // Texturierung wird deaktiviert //gl.glDisable(GL2.GL_TEXTURE_2D); /** alternativer Ansatz (fürs Testen: der obige ↑ Schnipsel (Absatz) - auskommentieren, der untere ↓ - kommentieren) */ texture_alternativ.disable(gl); rtri +=0.2f; } //-------------------------------------------------------------------- @Override public void dispose(GLAutoDrawable drawable) {} //-------------------------------------------------------------------- @Override public void reshape(GLAutoDrawable drawable, int x, int y, int width, int height) { final GL2 gl = drawable.getGL().getGL2(); final float h = ( float ) width / ( float ) height; gl.glViewport( 0, 0, width, height ); gl.glMatrixMode( GL2.GL_PROJECTION ); gl.glLoadIdentity(); glu.gluPerspective( 45.0f, h, 1.0, 20.0 ); gl.glMatrixMode( GL2.GL_MODELVIEW ); gl.glLoadIdentity(); } }