2014-01-22 2 views
1

Я работаю над объектной моделью, но кажется, что что-то не так. Это то, что я получаю, когда я рисую чайник:Ошибка чертежа OpenGL для чайника

Teapot

Как вы можете видеть, фоновые объекты появляются на переднем плане, как кольца в верхней части. Я работаю над всем, что я могу изменить, например, плоскостью отсечения и буфером глубины, но я просто не могу заставить модель выглядеть твердой. У меня есть возможность включения глубины, а также очистка буфера глубины и цветового буфера. Я не могу сказать, что случилось.

Вот мой код листинга:

void displayLighting() { 
    if (specular) 
     glLightfv(GL_LIGHT0, GL_SPECULAR, specularLight); 
    else 
     glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuseLight); 

    glLightfv(GL_FRONT, GL_SHININESS, shininess); 

    lightPos[0] = lightDist*sinf(lightAngle); 
    lightPos[1] = lightDist; 
    lightPos[2] = lightDist*cosf(lightAngle); 
    glLightfv(GL_LIGHT0, GL_POSITION, lightPos); 
} 

void drawTeapot() { 
    float diffuseMaterial[] = { 1.f, 1.f, 1.f }; 
    glTranslatef(0.f, -0.f, -0.f); 

    glShadeModel(GL_SMOOTH); 

    glMaterialfv(GL_FRONT, GL_DIFFUSE, diffuseMaterial); 
    glutSolidTeapot(20.0f); 
} 

void renderScene(void) { 
    glClearColor(0.f,0.f,0.f,1.f); 
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
    glLoadIdentity(); 
    gluLookAt(zDist*(sinf(yAngle)),zDist*(sinf(xAngle)),zDist*(cosf(xAngle))*(cosf(yAngle)),0,0,0,0,1,0); 

    displayLighting(); 

    drawTeapot(); 

    glutSwapBuffers(); 
} 

void changeSize(int width, int height) { 
    float ratio; 

    ratio = w * 1.0f/h; 

    glMatrixMode(GL_PROJECTION); 
    glViewport(0, 0, w, h); 
    glLoadIdentity(); 
    gluPerspective(45.0f, ratio, 100.0f, 1000.0f); 
    glMatrixMode(GL_MODELVIEW); 
} 

int main(int argc, char **argv) { 
// init GLUT and create window 
    glutInit(&argc, argv); 
    glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA); 
    glutInitWindowPosition(0,0); 
    glutInitWindowSize(800,600); 
    glutCreateWindow("Teapot"); 

    initLighting(); 
    glutDisplayFunc(renderScene); 
    glutReshapeFunc(changeSize); 
    glutIdleFunc(renderScene); 

    glEnable(GL_DEPTH_TEST); 
    glEnable(GL_CULL_FACE); 
    glutMainLoop(); 
} 

Я уверен, что это легко исправить, но я надеюсь, что вы, ребята могут помочь.

+0

На первый взгляд этот код выглядит хорошо. Можете ли вы добавить код для 'displayLighting()' и 'drawTeapot()'? – user1781290

+0

похоже, что не проводится никаких испытаний глубины –

+0

Пожалуйста, см. Правки, спасибо, что следите за мной, я все еще озадачен ... –

ответ

3

Согласно manpage glutSolidTeapot, сгенерированные нормали ориентированы в противоположном направлении, чем ожидалось. Как было предложено, используйте glFrontFace(GL_CW)/glFrontFace(GL_CCW), чтобы временно изменить ориентацию по умолчанию для лицевых поверхностей.

+0

Большое вам спасибо! Я уже много часов занимаюсь этим! Работает как шарм –

Смежные вопросы