Atikah Mohamad
Atikah Mohamad

Reputation: 71

OpenGL Not All Quads Filled

I'm trying to get all the quads filled. At the moment it colors only the right side of the box. Here is my code.

void showPictureW()
{
    glDepthMask(true);
    glColor3f(1,0,0);

    //front
    glBegin( GL_QUADS );
    glVertex3f(-1.2,0.8,-4.0);
    glVertex3f(2,0.8,-4.0);
    glVertex3f(2,0.0,-4.0);
    glVertex3f(-1.2,0.0,-4.0);
    glEnd();

    //back
    glBegin( GL_QUADS );
    glVertex3f(1.8,1.0,-4.0); //2
    glVertex3f(1.8,1.8,-4.0);
    glVertex3f(5.0,1.8,-4.0);
    glVertex3f(5.0,1.0,-4.0);
    glEnd();

    //left
    glBegin( GL_QUADS );
    glVertex3f(1.8,1.8,-4.0);
    glVertex3f(1.8,1.0,-4.0);
    glVertex3f(-1.2,0.0,-4.0);
    glVertex3f(-1.2,0.8,-4.0);
    glEnd();

    //right
    glBegin( GL_QUADS );
    glVertex3f(2.0,0.8,-4.0);
    glVertex3f(2.0,0.0,-4.0);
    glVertex3f(5.0,1.0,-4.0);
    glVertex3f(5.0,1.8,-4.0);
    glEnd();
}

static void resize(int width, int height)
{
    const float ar = (float) width / (float) height;

    glViewport(0, 0, width, height);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glFrustum(-ar, ar, -1.0, 1.0, 1.0, 100.0);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
}

static void display(void)
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    glPushMatrix();
    glTranslated(-3.5,-3,0);
    showPictureW();
    glPopMatrix();

    glutSwapBuffers();
}

static void idle(void)
{
    glutPostRedisplay();
}

    const GLfloat light_ambient[]  = { 0.0f, 0.0f, 0.0f, 1.0f };
    const GLfloat light_diffuse[]  = { 1.0f, 1.0f, 1.0f, 1.0f };
    const GLfloat light_specular[] = { 1.0f, 1.0f, 1.0f, 1.0f };
    const GLfloat light_position[] = { 2.0f, 5.0f, 5.0f, 0.0f };

    const GLfloat mat_ambient[]    = { 0.7f, 0.7f, 0.7f, 1.0f };
    const GLfloat mat_diffuse[]    = { 0.8f, 0.8f, 0.8f, 1.0f };
    const GLfloat mat_specular[]   = { 1.0f, 1.0f, 1.0f, 1.0f };
    const GLfloat high_shininess[] = { 100.0f };

/* Program entry point */

int main(int argc, char *argv[])
{
    glutInit(&argc, argv);
    glutInitWindowSize(800,600);
    glutInitWindowPosition(10,10);
    glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);

    glutCreateWindow("FreeGLUT Shapes");

    glutReshapeFunc(resize);
    glutDisplayFunc(display);
    glutKeyboardFunc(key);
    glutIdleFunc(idle);

    glClearColor(1,1,1,1);
    glEnable(GL_CULL_FACE);
    glCullFace(GL_BACK);

    glEnable(GL_DEPTH_TEST);
    glDepthFunc(GL_LESS);

    glEnable(GL_LIGHT0);
    glEnable(GL_NORMALIZE);
    glEnable(GL_COLOR_MATERIAL);
    glEnable(GL_LIGHTING);

    glLightfv(GL_LIGHT0, GL_AMBIENT,  light_ambient);
    glLightfv(GL_LIGHT0, GL_DIFFUSE,  light_diffuse);
    glLightfv(GL_LIGHT0, GL_SPECULAR, light_specular);
    glLightfv(GL_LIGHT0, GL_POSITION, light_position);

    glMaterialfv(GL_FRONT, GL_AMBIENT,   mat_ambient);
    glMaterialfv(GL_FRONT, GL_DIFFUSE,   mat_diffuse);
    glMaterialfv(GL_FRONT, GL_SPECULAR,  mat_specular);
    glMaterialfv(GL_FRONT, GL_SHININESS, high_shininess);

    glutMainLoop();

    return EXIT_SUCCESS;
}

When I use GL_LINE_LOOP the box displays fine. It's when I change to quads it doesn't output properly.

Upvotes: 1

Views: 603

Answers (1)

genpfault
genpfault

Reputation: 52090

glEnable(GL_CULL_FACE);
glCullFace(GL_BACK);

Make sure all your quads have the "correct" counter-clockwise winding.

Or disable culling.

Upvotes: 1

Related Questions