简体   繁体   中英

OpenGL C++ Depth buffer not working

I've been testing with OpenGL for a while and have not been able to get the depth buffer to work, despite using GLUT_DEPTH as a parameter in glutInitDisplayMode and doing glClear(GL_DEPTH_BUFFER_BIT) at the start of the display function. I don't know what else I'm missing.

Below is a minimum working example and Figure 1 and 2. Comment out the parameters under Figure 1 and 2 when you want to view the other one.

Figure 1 (above blue):

图片1

Figure 2 (below red):

图片2

Example:

#include <vector>
#include <gl\glut.h>

typedef std::vector<float> floatvec;

// Figure 1 (above blue)
float posX = 8.00f;
float posY = 7.54f;
float posZ = -0.89f;
float angleX = 300.50f;
float angleY = 45.33f;

// Figure 2 (below red)
float posX = 4.12f;
float posY = -4.87f;
float posZ = -3.84f;
float angleX = 343.25f;
float angleY = -45.00f;

int screenW = 720;
int screenH = 540;
float fMin = 0.5;
float fMax = 100.0;
float alpha = 60.0;

// Draws a rectangle in 3D
void DrawQuad(floatvec c) {
    glBegin(GL_QUADS);
    glVertex3f(-c[0], -c[1], -c[2]);
    glVertex3f(-c[3], -c[4], -c[5]);
    glVertex3f(-c[6], -c[7], -c[8]);
    glVertex3f(-c[9], -c[10], -c[11]);
    glEnd();
}

void Display() {
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glLoadIdentity();
    glPushMatrix();
    glRotatef(angleY, 1.0f, 0.0f, 0.0f);
    glRotatef(angleX, 0.0f, 1.0f, 0.0f);
    glRotatef(180.0, 0.0f, 0.0f, 1.0f);
    glTranslatef(posX, posY, posZ);

    // Draws the tiles
    glColor3f(1.0, 0.0, 0.0); // Red
    DrawQuad({ 0, 0, 0,
        5, 0, 0,
        5, 0, 5,
        0, 0, 5 });
    glColor3f(0.0, 0.0, 1.0); // Blue
    DrawQuad({ 0, 3, 0,
        5, 3, 0,
        5, 3, 5,
        0, 3, 5 });

    glPopMatrix();
    glutSwapBuffers();
}

void Reshape(int width, int height) {
    glViewport(0, 0, (GLsizei)width, (GLsizei)height);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluPerspective(alpha, (GLfloat)width / (GLfloat)height, fMin, fMax);
    glMatrixMode(GL_MODELVIEW);
}

int main(int iArgc, char** cppArgv) {
    glutInit(&iArgc, cppArgv);
    glEnable(GL_DEPTH_TEST);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
    glutInitWindowSize(screenW, screenH);
    glutCreateWindow("Example");
    glutDisplayFunc(Display);
    glutIdleFunc(Display);
    glutReshapeFunc(Reshape);
    glutMainLoop();
    return 0;
}

You just need to change where you call glEnable(GL_DEPTH_TEST);

Put it after glutCreateWindow and it will work fine.

Something like this:

int main(int iArgc, char** cppArgv) {
    glutInit(&iArgc, cppArgv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
    glutInitWindowSize(screenW, screenH);
    glutCreateWindow("Example");
    glEnable(GL_DEPTH_TEST);
    glutDisplayFunc(Display);
    glutIdleFunc(Display);
    glutReshapeFunc(Reshape);
    glutMainLoop();
    return 0;
}

Just tested here and it worked.

I am a little bit rusty in OpenGL, but, putting the glEnable line in the Display function will make the trick.

#include <vector>
#include <GL/glut.h>

typedef std::vector<float> floatvec;

//Figure 1 (above blue)
//float posX = 8.00f;
//float posY = 7.54f;
//float posZ = -0.89f;
//float angleX = 300.50f;
//float angleY = 45.33f;

// Figure 2 (below red)
float posX = 4.12f;
float posY = -4.87f;
float posZ = -3.84f;
float angleX = 343.25f;
float angleY = -45.00f;

int screenW = 720;
int screenH = 540;
float fMin = 0.5;
float fMax = 100.0;
float alpha = 60.0;

// Draws a rectangle in 3D
void DrawQuad(floatvec c) {
        glBegin(GL_QUADS);
        glVertex3f(-c[0], -c[1], -c[2]);
        glVertex3f(-c[3], -c[4], -c[5]);
        glVertex3f(-c[6], -c[7], -c[8]);
        glVertex3f(-c[9], -c[10], -c[11]);
        glEnd();
}

void Display() {
        glEnable(GL_DEPTH_TEST);
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
        glLoadIdentity();
        glPushMatrix();
        glRotatef(angleY, 1.0f, 0.0f, 0.0f);
        glRotatef(angleX, 0.0f, 1.0f, 0.0f);
        glRotatef(180.0, 0.0f, 0.0f, 1.0f);
        glTranslatef(posX, posY, posZ);

        // Draws the tiles
        glColor3f(1.0, 0.0, 0.0); // Red
        DrawQuad({ 0, 0, 0,
                        5, 0, 0,
                        5, 0, 5,
                        0, 0, 5 });
        glColor3f(0.0, 0.0, 1.0); // Blue
        DrawQuad({ 0, 3, 0,
                        5, 3, 0,
                        5, 3, 5,
                        0, 3, 5 });

        glPopMatrix();
        glutSwapBuffers();
}

void Reshape(int width, int height) {
        glViewport(0, 0, (GLsizei)width, (GLsizei)height);
        glMatrixMode(GL_PROJECTION);
        glLoadIdentity();
        gluPerspective(alpha, (GLfloat)width / (GLfloat)height, fMin, fMax);
        glMatrixMode(GL_MODELVIEW);
}

int main(int iArgc, char** cppArgv) {
        glutInit(&iArgc, cppArgv);
        glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
        glutInitWindowSize(screenW, screenH);
        glutCreateWindow("Example");
        glutDisplayFunc(Display);
        glutIdleFunc(Display);
        glutReshapeFunc(Reshape);
        glutMainLoop();
        return 0;
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM