OpenGL编程指南12:光照_渲染真实球体

1.场景中添加光照的步骤

1.定义每个物体的每个顶点的法线向量。这个法向量决定了物体相对于光源的方向。
2.创建和选择一个或多个光照,并设置他们的位置。
3.创建和选择一种光照模型,它定义了全局环境光的层析以及观察点的有效位置(便于进行光照计算)。
4.定义场景中物体的材料属性。

2.光照球体及分析

#include 

void init(void)
{//光照参数初始化全位于此处
	GLfloat mat_specular   [] = {1.0,1.0,1.0,1.0};
	GLfloat mat_shininess  [] = {100.0};
	GLfloat light_position [] = {5.0,5.0,5.0,1.0};  //点光源
	//GLfloat light_position [] = {0.0,0.0,50.0,0.0};  //无限远模拟平行光
	GLfloat white_light    [] = {1.0,1.0,1.0,1.0};
	GLfloat model_ambient  [] = {0.1,0.1,0.1,1.0};

	glClearColor(0.0,0.0,0.0,0.0);
	glShadeModel(GL_SMOOTH);
	//为场景中的物体定义材料属性:如何反射光线(材料环境、散射、镜面颜色、光泽度)
	glMaterialfv(GL_FRONT,GL_SPECULAR,mat_specular);     //使用镜面材质颜色
	glMaterialfv(GL_FRONT,GL_SHININESS,mat_shininess);   //使用光泽度

	glLightfv(GL_LIGHT0,GL_POSITION,light_position);        //定义光源的位置
	glLightfv(GL_LIGHT0,GL_DIFFUSE,white_light);            //定义散射光为白色
	glLightfv(GL_LIGHT0,GL_SPECULAR,white_light);           //定义镜面光为白色
	glLightModelfv(GL_LIGHT_MODEL_AMBIENT,model_ambient);   //光照模型参数:全局环境光

	glEnable(GL_LIGHTING); //驱动光源
	glEnable(GL_LIGHT0);   //启动特定光源
	glEnable(GL_DEPTH_TEST);
}
void display(void)
{
	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
	glutSolidSphere(1.0,300,16);   //定义球体法向量
	glFlush();
}
void reshape(int w, int h)
{
	glViewport(0,0,(GLsizei)w,(GLsizei)h);
	glMatrixMode(GL_PROJECTION);
	glLoadIdentity();
	if( w
输出结果:
OpenGL编程指南12:光照_渲染真实球体_第1张图片

3.注意事项

1.定义球体的法向量是在函数gluSolideSphere()中完成的。为了进行正确的光照运算,表面法相必须为单位法向量
2.光照模型中不仅仅定义了全局环境光,还定义了场景中观察者应该位于无限远处还是位于场景本地;也会确定场景中物体的正面和背面是否应该执行不同的光照运算。上例中采用了默认设置,即观察者位于无限远处,并且只有一面接受光照。

你可能感兴趣的:(计算机图像学,OpenGL编程)