如何在OpenGL中显示对象中的镜面反射点

时间:2017-07-02 15:33:38

标签: opengl

我正在创建一个球体。光源(环境光和漫射照明)效果很好。只有镜面光不会出现在球体的任何部分。

材料代码似乎不起作用。我删除了该行,结果也是一样的。

我想要的结果是球体旋转,上面有白点,以便看起来真实。

我是否缺少任何所需的照明配置?

有没有解决方案?

感谢。

enter image description here

float angle = 0.0f;

void initRendering(){
    glEnable(GL_DEPTH_TEST);
    glEnable(GL_COLOR_MATERIAL);
    glEnable(GL_NORMALIZE);
    glEnable(GL_LIGHTING);
    glEnable(GL_LIGHT0);
    glEnable(GL_LIGHT1);
}

void draw(){
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();

    glColor3f(1.0f, 0.0f, 0.0f);

    glPushMatrix();
        glRotatef(angle, 0.0, 1.0, 0.0);
        glutSolidSphere(0.5, 20, 20);
    glPopMatrix();

    GLfloat ambientColor[] = {0.0f, 0.0f, 0.0f, 1.0f};
    GLfloat diffuseColor[] = {1.0f, 1.0f, 1.0f, 1.0f};
    GLfloat specularColor[] = {1.0f, 1.0f, 1.0f, 1.0f};
    GLfloat lightPosition[] = {0.0f, 5.0f, -3.0f, 0.0f};

    GLfloat mat_specular[]   = { 0.8f, 0.8f, 0.8f, 1.0f };

    glLightfv(GL_LIGHT0, GL_AMBIENT, ambientColor);
    glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuseColor);
    glLightfv(GL_LIGHT0, GL_SPECULAR, specularColor);
    glLightfv(GL_LIGHT0, GL_POSITION, lightPosition);

    glColorMaterial(GL_FRONT, GL_AMBIENT_AND_DIFFUSE);
    glMaterialfv(GL_FRONT, GL_SPECULAR,  mat_specular);
    glMateriali(GL_FRONT, GL_SHININESS, 100);

    angle+=0.1f;
    glutPostRedisplay();
    glutSwapBuffers();
}

main(){
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH | GLUT_RGBA);
    glutInitWindowPosition(100, 100);
    glutInitWindowSize(600, 600);
    glutCreateWindow("Sphere");
    glClearColor(1.0, 1.0, 1.0, 1.0);
    initRendering();
    glutDisplayFunc(draw);
    glutMainLoop();
}

1 个答案:

答案 0 :(得分:1)

镜面反射光的默认值是添加到漫反射照明步骤中评估的颜色。镜面反射强度由镜面反射集调制。 您已将此颜色设置为“黑色”,因此它实际上为零。

GLfloat mat_specular[]   = { 0.8f, 0.8f, 0.8f, 1.0f };
// …
glMaterialfv(GL_FRONT, GL_SPECULAR,  mat_specular);

我开始时并没有抑制镜面术语。