2013-06-17 3 views
1

Я пытаюсь заполнить все квадраты. В данный момент он окрашивает только правую сторону коробки. Вот мой код.OpenGL Не все заполненные квадраты

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; 
} 

Когда я использую GL_LINE_LOOP, коробка отображает штраф. Когда я перехожу на квадроциклы, он не выводится правильно.

+0

может быть проблемой с отбраковкой. Попробуйте отключить его, и если это удастся, инвертируйте порядок вершин ваших квадрациклов. Вы уверены, что координаты правильные (например, все координаты z - -4). Кроме того, используйте только один 'glBegin()' в начале и один 'glEnd()' в конце. –

+0

Это работает. Я отключил отбраковку. Благодаря! :) Я связываю все координаты вершин вместе? Только с одним glBegin и glEnd? –

ответ

1
glEnable(GL_CULL_FACE); 
glCullFace(GL_BACK); 

Убедитесь, что все ваши квадроциклы имеют «правильную» против часовой стрелки обмотку.

Или отключить отбраковку.