OpenGL茶壶绘图错误

时间:2014-01-22 17:02:27

标签: c++ opengl 3d

我一直在研究一个对象模型,但似乎出了点问题。这是我画茶壶时得到的:

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

我很确定这是一个简单的修复,但我希望你们能帮帮忙。

1 个答案:

答案 0 :(得分:3)

根据glutSolidTeapot的manpage,生成的法线的方向与预期方向相反。如建议的那样,使用glFrontFace(GL_CW) / glFrontFace(GL_CCW)临时更改面的默认正面方向。