import java.awt.BorderLayout; import java.awt.Dimension; import java.nio.FloatBuffer; import java.nio.IntBuffer; import javax.media.opengl.GL2; import javax.media.opengl.GLAutoDrawable; import javax.media.opengl.GLEventListener; import javax.media.opengl.awt.GLJPanel; import javax.swing.JPanel; public class PyramidPanel extends JPanel { private static float[] pyramidVertexList=new float[]{1,0,1, 1,0,-1, -1,0,-1, -1,0,1, 0,1,0}; private static int[] pyramidIndexList=new int[]{0,4,3, 1,4,0, 2,4,1, 3,4,2, 0,3,2, 0,2,1}; private FloatBuffer pyramidVertexBuffer; private FloatBuffer pyramidNormalBuffer; private IntBuffer pyramidIndexBuffer; private int pyramidVertexBufferID; private int pyramidNormalBufferID; private int pyramidIndexBufferID; private GLJPanel drawable; private Camera camera; public PyramidPanel(){ GLEventListener glListener=new GLEventListener(){ public void init(GLAutoDrawable drawable){ GL2 gl=drawable.getGL().getGL2(); gl.glClearColor(0.75f,0.75f, 1,1); gl.glEnable(GL2.GL_LIGHTING); gl.glEnable(GL2.GL_LIGHT0); gl.glEnable(GL2.GL_DEPTH_TEST); gl.glEnable(GL2.GL_COLOR_MATERIAL); gl.glShadeModel(GL2.GL_SMOOTH); gl.glLightModeli(GL2.GL_LIGHT_MODEL_TWO_SIDE,GL2.GL_TRUE); //make vertex buffer and normal buffer int len=pyramidVertexList.length; pyramidVertexBuffer=FloatBuffer.allocate(len); pyramidNormalBuffer=FloatBuffer.allocate(len); for(int i=0;i<len;i++){ pyramidVertexBuffer.put(pyramidVertexList[i]); pyramidNormalBuffer.put(pyramidVertexList[i]); } pyramidVertexBuffer.rewind(); pyramidNormalBuffer.rewind(); //make index buffer len=pyramidIndexList.length; pyramidIndexBuffer=IntBuffer.allocate(len); for(int j=0;j<len;j++){ pyramidIndexBuffer.put(pyramidIndexList[j]); } pyramidIndexBuffer.rewind(); //gen 3 buffer IDs; int[] bufferIDs=new int[3]; gl.glGenBuffers(3, bufferIDs, 0); pyramidVertexBufferID=bufferIDs[0]; pyramidNormalBufferID=bufferIDs[1]; pyramidIndexBufferID=bufferIDs[2]; //bind the buffer to the IDs gl.glBindBuffer(GL2.GL_ARRAY_BUFFER, pyramidVertexBufferID); gl.glBufferData(GL2.GL_ARRAY_BUFFER, pyramidVertexBuffer.capacity()*4, pyramidVertexBuffer, GL2.GL_STATIC_DRAW); gl.glBindBuffer(GL2.GL_ARRAY_BUFFER, pyramidNormalBufferID); gl.glBufferData(GL2.GL_ARRAY_BUFFER,pyramidNormalBuffer.capacity()*4,pyramidNormalBuffer,GL2.GL_STATIC_DRAW); gl.glBindBuffer(GL2.GL_ARRAY_BUFFER, 0); gl.glBindBuffer(GL2.GL_ELEMENT_ARRAY_BUFFER, pyramidIndexBufferID); gl.glBufferData(GL2.GL_ELEMENT_ARRAY_BUFFER, pyramidIndexBuffer.capacity()*4, pyramidIndexBuffer, GL2.GL_STATIC_DRAW); gl.glBindBuffer(GL2.GL_ELEMENT_ARRAY_BUFFER, 0); } public void display(GLAutoDrawable drawable){ GL2 gl=drawable.getGL().getGL2(); gl.glClear(GL2.GL_COLOR_BUFFER_BIT|GL2.GL_DEPTH_BUFFER_BIT); camera.apply(gl); gl.glBindBuffer(GL2.GL_ARRAY_BUFFER,pyramidVertexBufferID); gl.glVertexPointer(3, GL2.GL_FLOAT, 0, 0); gl.glBindBuffer(GL2.GL_ARRAY_BUFFER, pyramidNormalBufferID); gl.glNormalPointer(GL2.GL_FLOAT, 0, 0); gl.glColor3f(0.8f,0.2f, 0.2f); //draw!!! gl.glEnableClientState(GL2.GL_VERTEX_ARRAY); gl.glEnableClientState(GL2.GL_NORMAL_ARRAY); // pyramidIndexBuffer.position(0); // gl.glDrawElements(GL2.GL_TRIANGLES, 3, GL2.GL_UNSIGNED_INT, pyramidIndexBuffer); // // pyramidIndexBuffer.position(3); // gl.glDrawElements(GL2.GL_TRIANGLES, 3, GL2.GL_UNSIGNED_INT, pyramidIndexBuffer); // // pyramidIndexBuffer.position(6); // gl.glDrawElements(GL2.GL_TRIANGLES, 3, GL2.GL_UNSIGNED_INT, pyramidIndexBuffer); // // pyramidIndexBuffer.position(9); // gl.glDrawElements(GL2.GL_TRIANGLES, 3, GL2.GL_UNSIGNED_INT, pyramidIndexBuffer); // // pyramidIndexBuffer.position(12); // gl.glDrawElements(GL2.GL_TRIANGLES, 3, GL2.GL_UNSIGNED_INT, pyramidIndexBuffer); // // pyramidIndexBuffer.position(15); // gl.glDrawElements(GL2.GL_TRIANGLES, 3, GL2.GL_UNSIGNED_INT, pyramidIndexBuffer); gl.glDrawRangeElements(GL2.GL_TRIANGLES, 0, 17, 18, GL2.GL_UNSIGNED_INT, pyramidIndexBuffer); gl.glDisableClientState(GL2.GL_VERTEX_ARRAY); gl.glDisableClientState(GL2.GL_NORMAL_ARRAY); } public void reshape(GLAutoDrawable drawable,int x,int y,int width,int height){ GL2 gl = drawable.getGL().getGL2(); double s = 1.5; // limits of cube that we want to view go from -s to s. gl.glMatrixMode(GL2.GL_PROJECTION); gl.glLoadIdentity(); // Start with the identity transform. if (width > height) { // Expand x limits to match viewport aspect ratio. double ratio = (double)width/height; gl.glOrtho(-s*ratio, s*ratio, -s, s, -s, s); } else { // Expand y limits to match viewport aspect ratio. double ratio = (double)height/width; gl.glOrtho(-s, s, -s*ratio, s*ratio, -s, s); } gl.glMatrixMode(GL2.GL_MODELVIEW); } public void dispose(GLAutoDrawable drawable){ } }; drawable=new GLJPanel(); drawable.setPreferredSize(new Dimension(800,800)); drawable.addGLEventListener(glListener); this.setLayout(new BorderLayout()); this.add(drawable,BorderLayout.CENTER); camera=new Camera(); camera.setScale(2); new TrackBall(this,camera); } }
1. make some buffers , vertexBuffer (FloatBuffer) , colorBuffer(FloatBuffer), normalBuffer(FloatBuffer),
of course an indexBuffer (INTBuffer) ( In OpenGL ES , must be unsigned-short ,not int)
2. use GL2.glGenBuffer to gen a bufferID list.
3. pass the buffer to the binded ID gl.glBindBuffer(...) , gl.glBufferData(...)
4. release the binding , (binding ID-0 );
5. in display function , Bind the buffers again and set the pointer.
6. enable all necessery ARRAY (can be set in the init function)
7. drawElement , or draw range element
Super crazy process to draw a scene ... !