Hey,
I wrote a simple application to show cubes. When rendering a single cube, everything works fine (no overlapping of faces of one cube). But when I render more cubes, some faces overlap faces of other cubes.
My most important methods:
private void initGL(){
GL11.glViewport(0, 0, width, height);
GL11.glEnable(GL11.GL_DEPTH_TEST);
GL11.glDepthFunc(GL11.GL_LEQUAL);
GL11.glEnable(GL11.GL_CULL_FACE);
GL11.glMatrixMode(GL11.GL_PROJECTION);
GL11.glLoadIdentity();
GLU.gluPerspective(45, (float)width / height, 0, 1000);
GL11.glMatrixMode(GL11.GL_MODELVIEW);
}
private void render(){
GL11.glClear(GL11.GL_COLOR_BUFFER_BIT | GL11.GL_DEPTH_BUFFER_BIT);
GL11.glLoadIdentity();
GL11.glPushMatrix();
GL11.glTranslatef(0, 0, -7);
GL11.glRotatef(rotationY, 0, 1, 0);
GL11.glRotatef(rotationX, 1, 0, 0);
GL11.glTranslatef(-1, 0, 0);
renderCube(true, false, true, true, true, true);
GL11.glTranslatef(1, 0, 0);
renderCube(false, false, false, true, true, true);
GL11.glTranslatef(1, 0, 0);
renderCube(false, true, true, true, true, true);
GL11.glTranslatef(-1, 1, 0);
renderCube(true, true, true, false, true, true);
GL11.glTranslatef(0, -2, 0);
renderCube(true, true, false, true, true, true);
GL11.glTranslatef(0, 1, 1);
renderCube(true, true, true, true, true, false);
GL11.glTranslatef(0, 0, -2);
renderCube(true, true, true, true, false, true);
GL11.glPopMatrix();
}
private void renderCube(boolean left, boolean right, boolean top, boolean bottom, boolean front, boolean back){
GL11.glBegin(GL11.GL_QUADS);
//front
if(front){
GL11.glColor3f(1, 0, 0);
GL11.glVertex3f(-0.5f, -0.5f, 0.5f);
GL11.glVertex3f(0.5f, -0.5f, 0.5f);
GL11.glVertex3f(0.5f, 0.5f, 0.5f);
GL11.glVertex3f(-0.5f, 0.5f, 0.5f);
}
//left
if(left){
GL11.glColor3f(0, 1, 0);
GL11.glVertex3f(-0.5f, -0.5f, -0.5f);
GL11.glVertex3f(-0.5f, -0.5f, 0.5f);
GL11.glVertex3f(-0.5f, 0.5f, 0.5f);
GL11.glVertex3f(-0.5f, 0.5f, -0.5f);
}
//right
if(right){
GL11.glColor3f(0, 0, 1);
GL11.glVertex3f(0.5f, -0.5f, -0.5f);
GL11.glVertex3f(0.5f, 0.5f, -0.5f);
GL11.glVertex3f(0.5f, 0.5f, 0.5f);
GL11.glVertex3f(0.5f, -0.5f, 0.5f);
}
//bottom
if(bottom){
GL11.glColor3f(1, 1, 0);
GL11.glVertex3f(-0.5f, -0.5f, -0.5f);
GL11.glVertex3f(0.5f, -0.5f, -0.5f);
GL11.glVertex3f(0.5f, -0.5f, 0.5f);
GL11.glVertex3f(-0.5f, -0.5f, 0.5f);
}
//top
if(top){
GL11.glColor3f(1, 0, 1);
GL11.glVertex3f(0.5f, 0.5f, -0.5f);
GL11.glVertex3f(-0.5f, 0.5f, -0.5f);
GL11.glVertex3f(-0.5f, 0.5f, 0.5f);
GL11.glVertex3f(0.5f, 0.5f, 0.5f);
}
//back
if(back){
GL11.glColor3f(0, 1, 1);
GL11.glVertex3f(0.5f, -0.5f, -0.5f);
GL11.glVertex3f(-0.5f, -0.5f, -0.5f);
GL11.glVertex3f(-0.5f, 0.5f, -0.5f);
GL11.glVertex3f(0.5f, 0.5f, -0.5f);
}
GL11.glEnd();
}
I thought, with the statements…
GL11.glEnable(GL11.GL_DEPTH_TEST);
GL11.glDepthFunc(GL11.GL_LEQUAL);
…OpenGL always only change pixels, if the depth is less or equal to the current pixel’s depth, so it shouldn’t cause problems with overlapping cube faces, not depending on the order, the cubes are rendered.
Thanks for any help