Login  Register

Re: vbo draw elements vs image draw pixels - strange difference

Posted by rtayek on Sep 03, 2012; 9:10pm
URL: https://forum.jogamp.org/vbo-draw-elements-vs-image-draw-pixels-strange-difference-tp4026002p4026016.html

here is the modified lesson 6:

package jogl;
import java.awt.*;
import java.awt.event.*;
import java.io.File;
import java.io.IOException;
import javax.swing.*;
import javax.media.opengl.GL2;
import javax.media.opengl.GLAutoDrawable;
import javax.media.opengl.GLEventListener;
import javax.media.opengl.GLException;
import javax.media.opengl.awt.GLCanvas;
import javax.media.opengl.fixedfunc.GLPointerFunc;
import javax.media.opengl.glu.GLU;
import com.jogamp.opengl.util.FPSAnimator;
import com.jogamp.opengl.util.texture.Texture;
import com.jogamp.opengl.util.texture.TextureCoords;
import com.jogamp.opengl.util.texture.TextureIO;
import static javax.media.opengl.GL.*; // GL constants
import static javax.media.opengl.GL2.*; // GL2 constants
import static jogl.G.*;
/**
 * NeHe Lesson #6 (JOGL 2 Port): Texture
 * @author Hock-Chuan Chua
 * @version May 2012
 */
@SuppressWarnings("serial") public class JOGL2Nehe06Texture extends GLCanvas implements GLEventListener {
        // Define constants for the top-level container
        private static String TITLE="NeHe Lesson #6: Texture";
        private static final int CANVAS_WIDTH=320; // width of the drawable
        private static final int CANVAS_HEIGHT=240; // height of the drawable
        private static final int FPS=60; // animator's target frames per second
        /** The entry main() method to setup the top-level container and animator */
        public static void main(String[] args) {
                // Run the GUI codes in the event-dispatching thread for thread safety
                SwingUtilities.invokeLater(new Runnable() {
                        @Override public void run() {
                                // Create the OpenGL rendering canvas
                                GLCanvas canvas=new JOGL2Nehe06Texture();
                                canvas.setPreferredSize(new Dimension(CANVAS_WIDTH,CANVAS_HEIGHT));
                                // Create a animator that drives canvas' display() at the specified FPS.
                                final FPSAnimator animator=new FPSAnimator(canvas,FPS,true);
                                // Create the top-level container
                                final JFrame frame=new JFrame(); // Swing's JFrame or AWT's Frame
                                frame.getContentPane().add(canvas);
                                frame.addWindowListener(new WindowAdapter() {
                                        @Override public void windowClosing(WindowEvent e) {
                                                // Use a dedicate thread to run the stop() to ensure that the
                                                // animator stops before program exits.
                                                new Thread() {
                                                        @Override public void run() {
                                                                if(animator.isStarted())
                                                                        animator.stop();
                                                                System.exit(0);
                                                        }
                                                }.start();
                                        }
                                });
                                frame.setTitle(TITLE);
                                frame.pack();
                                frame.setVisible(true);
                                animator.start(); // start the animation loop
                        }
                });
        }
        // Setup OpenGL Graphics Renderer
        private GLU glu; // for the GL Utility
        // Rotational angle about the x, y and z axes in degrees
        private static float angleX=0.0f;
        private static float angleY=0.0f;
        private static float angleZ=0.0f;
        // Rotational speed about x, y, z axes in degrees per refresh
        private static float rotateSpeedX=0.3f;
        private static float rotateSpeedY=0.2f;
        private static float rotateSpeedZ=0.4f;
        // Texture
        private Texture texture;
        private String textureFileName="resources/nehe.png";
        private String textureFileType=".png";
        // Texture image flips vertically. Shall use TextureCoords class to retrieve the
        // top, bottom, left and right coordinates.
        private float textureTop,textureBottom,textureLeft,textureRight;
        /** Constructor to setup the GUI for this Component */
        public JOGL2Nehe06Texture() {
                this.addGLEventListener(this);
        }
        // ------ Implement methods declared in GLEventListener ------
        /**
         * Called back immediately after the OpenGL context is initialized. Can be used to perform one-time initialization. Run only once.
         */
        @Override public void init(GLAutoDrawable drawable) {
                GL2 gl=drawable.getGL().getGL2(); // get the OpenGL graphics context
                glu=new GLU(); // get GL Utilities
                gl.glClearColor(0.0f,0.0f,0.0f,0.0f); // set background (clear) color
                gl.glClearDepth(1.0f); // set clear depth value to farthest
                gl.glEnable(GL_DEPTH_TEST); // enables depth testing
                gl.glDepthFunc(GL_LEQUAL); // the type of depth test to do
                gl.glHint(GL_PERSPECTIVE_CORRECTION_HINT,GL_NICEST); // best perspective correction
                gl.glShadeModel(GL_SMOOTH); // blends colors nicely, and smoothes out lighting
                // Load texture from image
                try {
                        // Create a OpenGL Texture object from (URL, mipmap, file suffix)
                        // Use URL so that can read from JAR and disk file.
                        // texture=TextureIO.newTexture(getClass().getClassLoader().getResource(textureFileName),false,textureFileType);
                        File file=new File(textureFileName);
                        System.out.println(file+" "+textureFileType);
                        texture=TextureIO.newTexture(file,false);
                        // Use linear filter for texture if image is larger than the original texture
                        gl.glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
                        // Use linear filter for texture if image is smaller than the original texture
                        gl.glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
                        // Texture image flips vertically. Shall use TextureCoords class to retrieve
                        // the top, bottom, left and right coordinates, instead of using 0.0f and 1.0f.
                        TextureCoords textureCoords=texture.getImageTexCoords();
                        textureTop=textureCoords.top();
                        textureBottom=textureCoords.bottom();
                        textureLeft=textureCoords.left();
                        textureRight=textureCoords.right();
                } catch(GLException e) {
                        e.printStackTrace();
                } catch(IOException e) {
                        e.printStackTrace();
                }
        }
        /**
         * Call-back handler for window re-size event. Also called when the drawable is first set to visible.
         */
        @Override public void reshape(GLAutoDrawable drawable,int x,int y,int width,int height) {
                GL2 gl=drawable.getGL().getGL2(); // get the OpenGL 2 graphics context
                if(height==0)
                        height=1; // prevent divide by zero
                float aspect=(float)width/height;
                // Set the view port (display area) to cover the entire window
                gl.glViewport(0,0,width,height);
                // Setup perspective projection, with aspect ratio matches viewport
                gl.glMatrixMode(GL_PROJECTION); // choose projection matrix
                gl.glLoadIdentity(); // reset projection matrix
                glu.gluPerspective(45.0,aspect,0.1,100.0); // fovy, aspect, zNear, zFar
                // Enable the model-view transform
                gl.glMatrixMode(GL_MODELVIEW);
                gl.glLoadIdentity(); // reset
        }
        /**
         * Called back by the animator to perform rendering.
         */
        @Override public void display(GLAutoDrawable drawable) {
                GL2 gl=drawable.getGL().getGL2(); // get the OpenGL 2 graphics context
                gl.glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); // clear color and depth buffers
                // ------ Render a Cube with texture ------
                gl.glLoadIdentity(); // reset the model-view matrix
                gl.glPushMatrix();
                gl.glTranslated(0,0,-5); // translate into the screen
                gl.glRotated(angleX,1,0,0); // rotate about the x-axis
                gl.glRotated(angleY,0,1,0); // rotate about the y-axis
                gl.glRotated(angleZ,0,0,1); // rotate about the z-axis
                if(true) {
                        // Enables this texture's target in the current GL context's state.
                        texture.enable(gl); // same as gl.glEnable(texture.getTarget());
                        // gl.glTexEnvi(GL.GL_TEXTURE_ENV, GL.GL_TEXTURE_ENV_MODE, GL.GL_REPLACE);
                        // Binds this texture to the current GL context.
                        texture.bind(gl); // same as gl.glBindTexture(texture.getTarget(), texture.getTextureObject());
                        if(true) {
                                gl.glBegin(GL_QUADS);
                                // Front Face
                                gl.glTexCoord2f(textureLeft,textureBottom);
                                gl.glVertex3f(-1.0f,-1.0f,1.0f); // bottom-left of the texture and quad
                                gl.glTexCoord2f(textureRight,textureBottom);
                                gl.glVertex3f(1.0f,-1.0f,1.0f); // bottom-right of the texture and quad
                                gl.glTexCoord2f(textureRight,textureTop);
                                gl.glVertex3f(1.0f,1.0f,1.0f); // top-right of the texture and quad
                                gl.glTexCoord2f(textureLeft,textureTop);
                                gl.glVertex3f(-1.0f,1.0f,1.0f); // top-left of the texture and quad
                                // Back Face
                                gl.glTexCoord2f(textureRight,textureBottom);
                                gl.glVertex3f(-1.0f,-1.0f,-1.0f);
                                gl.glTexCoord2f(textureRight,textureTop);
                                gl.glVertex3f(-1.0f,1.0f,-1.0f);
                                gl.glTexCoord2f(textureLeft,textureTop);
                                gl.glVertex3f(1.0f,1.0f,-1.0f);
                                gl.glTexCoord2f(textureLeft,textureBottom);
                                gl.glVertex3f(1.0f,-1.0f,-1.0f);
                                // Top Face
                                gl.glTexCoord2f(textureLeft,textureTop);
                                gl.glVertex3f(-1.0f,1.0f,-1.0f);
                                gl.glTexCoord2f(textureLeft,textureBottom);
                                gl.glVertex3f(-1.0f,1.0f,1.0f);
                                gl.glTexCoord2f(textureRight,textureBottom);
                                gl.glVertex3f(1.0f,1.0f,1.0f);
                                gl.glTexCoord2f(textureRight,textureTop);
                                gl.glVertex3f(1.0f,1.0f,-1.0f);
                                // Bottom Face
                                gl.glTexCoord2f(textureRight,textureTop);
                                gl.glVertex3f(-1.0f,-1.0f,-1.0f);
                                gl.glTexCoord2f(textureLeft,textureTop);
                                gl.glVertex3f(1.0f,-1.0f,-1.0f);
                                gl.glTexCoord2f(textureLeft,textureBottom);
                                gl.glVertex3f(1.0f,-1.0f,1.0f);
                                gl.glTexCoord2f(textureRight,textureBottom);
                                gl.glVertex3f(-1.0f,-1.0f,1.0f);
                                // Right face
                                gl.glTexCoord2f(textureRight,textureBottom);
                                gl.glVertex3f(1.0f,-1.0f,-1.0f);
                                gl.glTexCoord2f(textureRight,textureTop);
                                gl.glVertex3f(1.0f,1.0f,-1.0f);
                                gl.glTexCoord2f(textureLeft,textureTop);
                                gl.glVertex3f(1.0f,1.0f,1.0f);
                                gl.glTexCoord2f(textureLeft,textureBottom);
                                gl.glVertex3f(1.0f,-1.0f,1.0f);
                                // Left Face
                                gl.glTexCoord2f(textureLeft,textureBottom);
                                gl.glVertex3f(-1.0f,-1.0f,-1.0f);
                                gl.glTexCoord2f(textureRight,textureBottom);
                                gl.glVertex3f(-1.0f,-1.0f,1.0f);
                                gl.glTexCoord2f(textureRight,textureTop);
                                gl.glVertex3f(-1.0f,1.0f,1.0f);
                                gl.glTexCoord2f(textureLeft,textureTop);
                                gl.glVertex3f(-1.0f,1.0f,-1.0f);
                                gl.glEnd();
                        }
                        gl.glDisableClientState(GLPointerFunc.GL_TEXTURE_COORD_ARRAY);
                }
                gl.glPopMatrix();
                gl.glTranslated(0,0,-5);
                gl.glTranslated(2,2,0);
                gl.glColor3d(1,1,1);
                triangles(drawable);
                // Disables this texture's target (e.g., GL_TEXTURE_2D) in the current GL
                // context's state.
                // texture.disable(gl); // same as gl.glDisable(texture.getTarget());
                // Update the rotational angel after each refresh by the corresponding
                // rotational speed
                angleX+=rotateSpeedX;
                angleY+=rotateSpeedY;
                angleZ+=rotateSpeedZ;
        }
        /**
         * Called back before the OpenGL context is destroyed. Release resource such as buffers.
         */
        @Override public void dispose(GLAutoDrawable drawable) {}
}