下面在场景中建立一个光源,表示光源环境光、漫反射光、镜面光的三个参数。light_position的第四个分量w表示是定向光源还是点光源,如果w为0则表示是定向光源,如果w不为0,则表示是点光源,其中点光源的位置是(x/w,y/w,z/w)。
GLfloat light_ambient [] = {0.5, 0.5, 0.5, 1.0};
GLfloat light_diffuse [] = {1.0, 1.0, 1.0, 1.0};
GLfloat light_specular[] = {1.0, 1.0, 1.0, 1.0};
GLfloat light_position[] = {0.0, 0.0, 2.0, 0.0};
int glInit()
{
// 启用纹理映射
glEnable(GL_TEXTURE_2D);
//启用阴影平滑(Smooth Shading)。
glShadeModel(GL_SMOOTH);
//使用黑色背景,来表现光源的效果
glClearColor(0.0f,0.0f,0.0f,0.0f);
//设置深度缓冲
glClearDepth(1.0f);
//启动深度测试
glEnable(GL_DEPTH_TEST);
//深度测试的类型
glDepthFunc(GL_LEQUAL);
//进行透视修正
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
//以baby.bmp文件创建一个纹理
g_Texture[0] = CreateTexture("baby.bmp");
if(!g_Texture[0]) //创建失败则返回
{
MessageBox(g_hWnd, "创建纹理失败!", "提示", MB_OK);
return FALSE;
}
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);
glEnable(GL_LIGHTING); //启动光照
glEnable(GL_LIGHT0) ; //启动光源GL_LIGHT0
return TRUE;
}
在glMain()中,增加glLightfv(GL_LIGHT0, GL_POSITION, light_position)一行是为了将光源固定在一个位置上,否则,光源会和整个场景同时转动。
void glMain()
{
static int angle =0;
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity(); //加载单位矩阵
glTranslatef(0.0f, 0.0f, -10.0f);
glRotated(angle, 0, 1, 1);
//设定光源位置
glLightfv(GL_LIGHT0, GL_POSITION, light_position);
glBindTexture(GL_TEXTURE_2D, g_Texture[0]); // 选择纹理
DrawCube();
angle++;
SwapBuffers(g_hDC);
}
程序运行后效果如图7-1所示,可以看到,虽然在黑色的背景中,但纹理贴图的立方体却非常明亮,这就是光照的效果。
图7-1 光照