光照包括环境光、漫反射和镜面反射。在OpenGL中,我们要使用光照,首先要初始化光照信息。
//关闭背面渲染,提高效率
glEnable(GL_CULL_FACE);
//初始化灯光
float whiteColor[] = { 1.0f,1.0f,1.0f,1.0f };
//灯源位置
float lightPos[] = { 0.0f,1.0f,0.0f,0.0f };
//环境光
glLightfv(GL_LIGHT0, GL_AMBIENT, whiteColor);
//漫反射光
glLightfv(GL_LIGHT0, GL_DIFFUSE, whiteColor);
//镜面反射光
glLightfv(GL_LIGHT0, GL_SPECULAR, whiteColor);
//设置光源类型
glLightfv(GL_LIGHT0, GL_POSITION, lightPos);
//设置材质颜色
float blackMat[] = { 0.0f,0.0f,0.0f,1.0f };
float ambientMat[] = { 0.1f,0.1f,0.1f,1.0f };
float diffuseMat[] = { 0.4f,0.4f,0.4f,1.0f };
float specularMat[] = { 0.9f,0.9f,0.9f,1.0f };
glMaterialfv(GL_FRONT, GL_AMBIENT, ambientMat);
glMaterialfv(GL_FRONT, GL_DIFFUSE, diffuseMat);
glMaterialfv(GL_FRONT, GL_SPECULAR, specularMat);
//开启光照
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
glEnable(GL_DEPTH_TEST);
在上面代码中,分别设置了白色的灯光、灯源位置、环境光、漫反射、镜面反射以及光源类型和材质。然后我们还需要设置法线。
glLoadIdentity();
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
//开始绘制
glBegin(GL_TRIANGLES);
glNormal3f(0.0f, -1.0f, 0.0f);
glVertex3f(-1.0f, -0.5f, -2.0f);
glNormal3f(0.0f, 1.0f, 0.0f);
glVertex3f(1.0f,-0.5f, -2.0f);
glNormal3f(0.0f, 1.0f, 0.0f);
glVertex3f(0.0f, -0.5f, -10.0f);
//结束绘制
glEnd();
整个OpenGL光照的流程就完成了,来看下效果: