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

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

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

2.光照球体及分析

#include <vgl.h>

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<h )
		glOrtho(-1.5,1.5,-1.5*(GLfloat)h/(GLfloat)w,
		        1.5*(GLfloat)h/(GLfloat)w,-10.0,10.0);
	else
		glOrtho(-1.5,1.5,-1.5*(GLfloat)w/(GLfloat)h,
		        1.5*(GLfloat)w/(GLfloat)h,-10.0,10.0);
	glMatrixMode(GL_MODELVIEW);
	glLoadIdentity();
}
int main(int argc, char** argv)
{
	glutInit(&argc,argv);
	glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB|GLUT_DEPTH);
	glutInitWindowPosition(200,200);
	glutInitWindowSize(400,400);
	glutCreateWindow(argv[0]);
	init();
	glutDisplayFunc(display);
	glutReshapeFunc(reshape);
	glutMainLoop();
	return 0;
}
输出结果:

3.注意事项

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值