I have a JOGL opengl problem, I'm trying to use Vertex Arrays, but whenever I use glArrayElement (Note: glDrawElements doesn't work either.), it gives the point 0,0,0. Important code. I'm assuming a window is initialized and a reshape function is specified.
...
public void display(GLDrawable glDrawable) {
final GL gl = glDrawable.getGL();
gl.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT);
gl.glLoadIdentity();
gl.glTranslatef(0, 0, -6);
gl.glBegin(GL.GL_TRIANGLES);
gl.glColor3f(1.0f, 0.0f, 0.0f);
gl.glArrayElement(4);
/*gl.glArrayElement(5); // These are what I'm trying to use, but they seem to return the point 0,0,0.
gl.glArrayElement(6开发者_Go百科);
gl.glArrayElement(5);
gl.glArrayElement(6);
gl.glArrayElement(7);*/
//gl.glVertex3f(1, 1, -1); // Replaced with uncommented glArrayElement above.
gl.glColor3f(0.0f, 1.0f, 0.0f);
gl.glVertex3f(-1, 1, -1);
gl.glVertex3f(1, -1, -1);
gl.glColor3f(0.0f, 0.0f, 1.0f);
gl.glVertex3f(-1, 1, -1);
gl.glVertex3f(1, -1, -1);
gl.glVertex3f(-1, -1, -1);
gl.glEnd();
}
...
protected final static float[] mesh = {1,1,1, -1,1,1, 1,-1,1, -1,-1,1,
1,1,-1, -1,1,-1, 1,-1,-1, -1,-1,-1};
protected static ByteBuffer stdMesh;
...
public void init(GLDrawable glDrawable) {
final GL gl = glDrawable.getGL();
gl.glShadeModel(GL.GL_SMOOTH);
gl.glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
gl.glClearDepth(1.0f);
gl.glEnable(GL.GL_DEPTH_TEST);
gl.glDepthFunc(GL.GL_LEQUAL);
gl.glHint(GL.GL_PERSPECTIVE_CORRECTION_HINT, GL.GL_NICEST);
gl.glEnableClientState(GL.GL_VERTEX_ARRAY);
stdMesh = ByteBuffer.allocateDirect(mesh.length * 4);
stdMesh.asFloatBuffer().put(mesh);
gl.glVertexPointer(3, GL.GL_FLOAT, 0, stdMesh);
}
...
Are there other initalization functions/draw functions I also need to call, or is it another problem? Any help is appreciated.
You need to properly populate your buffer with your array values. The way you are doing it returns a new FloatBuffer but you are discarding the result instead of storing it.
Instead of
...
protected static ByteBuffer stdMesh;
...
stdMesh = ByteBuffer.allocateDirect(mesh.length * 4);
stdMesh.asFloatBuffer().put(mesh);
...
Do
...
protected static FloatBuffer stdMesh;
...
stdMesh = BufferUtil.newFloatBuffer(mesh.length * 3);
for (int i = 0; i < mesh.length; i++){
stdMesh.put(mesh[i]);
}
stdMesh.flip();
...
Make sure to call flip()
on the buffer before using it.
精彩评论