Take the 2-minute tour ×
Game Development Stack Exchange is a question and answer site for professional and independent game developers. It's 100% free, no registration required.

OK, so I successfully learned how to bind textures to quads and display this cool looking crate. However, when I rotate the cube something goes wrong. During rotation the back-face of the cube overlays the front-face and appears in front of the front-face. This is also the case with the right and left faces. They overlay each other giving a weird perception. I'm not sure why this happens. Here is the code where I draw only four face of the quad (front, back right, left).

gl.glClear(GL2.GL_COLOR_BUFFER_BIT | GL2.GL_DEPTH_BUFFER_BIT);      // clear the screen and depth buffers
gl.glLoadIdentity();                            // reset the current modelview matrix

    // draw quad
    gl.glTranslatef(0.0f, 0.0f, -6.0f);                 // translate to the left and into the screen
    gl.glRotatef(rotateAngle, 0.0f, 1.0f, 0.0f);        // rotate triangle around the y-axis
    gl.glBindTexture(GL2.GL_TEXTURE_2D, textures[2]);   // bind the texture you want to use to gl_texture_2d
    gl.glBegin(GL2.GL_QUADS);

        // front face
        gl.glTexCoord2f(0.0f, 1.0f);                // bottom left
        gl.glVertex3f(-1.0f, -1.0f, 1.0f);
        gl.glTexCoord2f(1.0f, 1.0f);                // bottom right
        gl.glVertex3f(1.0f, -1.0f, 1.0f);
        gl.glTexCoord2f(1.0f, 0.0f);                // top right
        gl.glVertex3f(1.0f, 1.0f, 1.0f);
        gl.glTexCoord2f(0.0f, 0.0f);                // top left
        gl.glVertex3f(-1.0f, 1.0f, 1.0f);

        // right face
        gl.glTexCoord2f(0.0f, 1.0f);                // bottom left
        gl.glVertex3f(1.0f, -1.0f, 1.0f);
        gl.glTexCoord2f(1.0f, 1.0f);                // bottom right
        gl.glVertex3f(1.0f, -1.0f, -1.0f);
        gl.glTexCoord2f(1.0f, 0.0f);                // top right
        gl.glVertex3f(1.0f, 1.0f, -1.0f);
        gl.glTexCoord2f(0.0f, 0.0f);                // top left
        gl.glVertex3f(1.0f, 1.0f, 1.0f);

        // left face
        gl.glTexCoord2f(0.0f, 1.0f);                // bottom left
        gl.glVertex3f(-1.0f, -1.0f, -1.0f);
        gl.glTexCoord2f(1.0f, 1.0f);                // bottom right
        gl.glVertex3f(-1.0f, -1.0f, 1.0f);
        gl.glTexCoord2f(1.0f, 0.0f);                // top right
        gl.glVertex3f(-1.0f, 1.0f, 1.0f);
        gl.glTexCoord2f(0.0f, 0.0f);                // top left
        gl.glVertex3f(-1.0f, 1.0f, -1.0f);

        // back face
        gl.glTexCoord2f(0.0f, 1.0f);                // bottom left
        gl.glVertex3f(-1.0f, -1.0f, -1.0f);
        gl.glTexCoord2f(1.0f, 1.0f);                // bottom right
        gl.glVertex3f(1.0f, -1.0f, -1.0f);
        gl.glTexCoord2f(1.0f, 0.0f);                // top right
        gl.glVertex3f(1.0f, 1.0f, -1.0f);
        gl.glTexCoord2f(0.0f, 0.0f);                // top left
        gl.glVertex3f(-1.0f, 1.0f, -1.0f);

    gl.glEnd();

Moreover, the way I draw textures and then vertices is not yet clear to me. According to what I've read the bottom-left corner (0, 0) is where the textures start drawing, so I should also start drawing my quad from bottom-left accordingly. I tried that but it didn't work. The texture was drawn, but up side down. So I had to go through some trial and error till I got the texture drawn correctly. I wish I could attach a picture to this post so I can show you how the back face of the cube overlays the front one during rotation, but I think this facility isn't provided in stack exchange. Thanks.

share|improve this question
    
A meta-observation: " this facility isn't provided in stack exchange"- you have the "img" button in your editor interface!! It's simple, it will upload your screen capture from your HDD, provided it's decent in size.. Apparently, your problem is caused by inconsistent texture mapping. Make sure you unwrap your cube in a plane and work your way from there.. like this –  teodron Apr 23 '12 at 8:48
    
Another observation: almost all the library functions you are using (glVertex3f, glTexCoord2f...) are deprecated in modern OpenGL. Check this question for a few pointers if you want to use modern OpenGL with Java. –  Sam Hocevar Apr 23 '12 at 9:07
1  
unfortunately i can't upload a screen-shot. stack exchange requires me to have more reputation :( but thanks for pointing that out –  moeabdol Apr 23 '12 at 9:36
add comment

2 Answers

up vote 2 down vote accepted

I figured the problem out! at first I thought it was a driver problem because i'm using mac os x like this http://forum.jogamp.org/Depth-buffer-not-working-on-Win7-64b-td1737435.html but then i tried it on 64-bit windows and the same problem occurred. Finally, I found out that it was a code problem due to gluProspective(). I didn't set zNear correctly I should have glu.gluPerspective(45.0f, (float) width / height, 1.0f, 100.0f) instead of glu.gluPerspective(45.0f, (float) width / height, 0.0f, 100.0f). Because opengl expects zNear to always be positive. Hope this will help other beginners who face the same problem.

share|improve this answer
    
Don't hesitate to accept your own answer, so that people see it at the top of the list. –  Sam Hocevar Apr 25 '12 at 7:54
add comment

Is depth test enabled and preserved? You need the following code somewhere at initialisation:

gl.glClearDepth(1.0f);
gl.glEnable(GL.GL_DEPTH_TEST);
gl.glDepthFunc(GL.GL_LEQUAL);
share|improve this answer
    
yes, i have added them at init(). here are the content of my init gl = drawable.getGL().getGL2(); glu = new GLUgl2(); gl.glClearColor(0.0f, 0.0f, 0.0f, 0.0f); gl.glEnable(GL2.GL_TEXTURE_2D); gl.glTexEnvi(GL2.GL_TEXTURE_ENV, GL2.GL_TEXTURE_ENV_MODE, GL2.GL_DECAL); gl.glShadeModel(GL2.GL_SMOOTH); gl.glClearDepth(1.0f); gl.glEnable(GL2.GL_DEPTH_TEST); gl.glDepthFunc(GL2.GL_LEQUAL); gl.glHint(GL2.GL_PERSPECTIVE_CORRECTION_HINT, GL2.GL_NICEST); –  moeabdol Apr 23 '12 at 9:29
add comment

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.