文档介绍:opengl开发颜色材料和光照基础知识
设置颜色模式:
glShadeModel();
GL_SMOOT // 平滑着色,图元的内部颜色是每个顶点颜色的平滑过渡。
GL_FLAT // 单调着色,图元的内部颜色就是最后一个顶点所指定的颜色。唯一例外的是GL_POLYGON图元,它的内部颜色是第一个定点的颜色。
在OpenGL光照模型中,除非一个物体自己会发光,否则它将受到3种不同类型的光的照射:环境光(ambient)、散射光(diffuse)和镜面光(specular)。
环境光(ambient):
环境光并不来自任何特定的方向。它来自某个光源,但光线却是在房间或场景中四处反射,没有方向可言。由环境光所照射的物体在所有方向的表面都是均匀照亮的。
散射光(diffuse):
散射光具有方向性,来自于一个特定的方向,它根据入射光线的角度在表面上均匀地反射开来。
镜面光(specular):
镜面光具有很强的方向性,但它的反射角度很锐利,只沿一个特定的方向反射。
打开关照:
glEnable(GL_LIGHTING);
这个调用告诉OpenGL在确定场景中的每个顶点的颜色时使用材料属性和光照参数。但是,如果没有指定任何的材料属性或光照参数,物体将会保持为黑暗的无光照状态。
设置光照模式:
glLightModel
或
glLightModelfv();
启动光源:
GLfloat ambientLight[ ] = { , , , };
GLfloat diffuseLight[ ] = { , , , };
//设置并启用光照0
glLightfv(GL_LIGHT0 , GL_AMBIENT, ambientLight);
glLightfv(GL_LIGHT0 , GL_DIFFUSE, diffuseLight);
启动光源0:
glEnable(GL_LIGHT0);
光的位置:
GLfloat lightPos [ ] = { -, , , };
glLightfv(GL_LIGHT0,GL_POSITION, lightPos);
在此,lightPos数组包含了光的位置。,表示指定的坐标是光源的位置。,则表示光是从无限远处沿这个数组所指定的向量照射过来的。
把一个位置光源变成一个聚光灯:
glLightf(GL_LIGHT0, GL_SPOT_CUTOFF, );
设置材料属性:
glMaterial();
或
glMaterialfv();
函数的第一个参数指定了材料属性是作用于正面、背面还是双面(GL_FRONT、GL_BACK或GL_FRONT_AND_BACK)。第二个参数指定将要设置哪个属性。最后一个参数是一个数组,它包含了构成这些属性的RGBA值。
第二种方法是我们所推荐的设置材料属性的方法,称为颜色追踪。使用颜色追踪,可以告诉OpenGL仅仅通过调用glColor来设置材料属性。为了启用颜色追踪,需要以GL_COLOR_MATERIAL为参数调用glEnable。
glEnable(GL_COLOR_MATERIAL);
接着,glColorMaterial函数根据glColor所设置的值来指定材料参数。
glColorMaterial(GL_FRONT,GL_AMBIENT_AND_DIFFUSE);
指定法线向量:
glNormal3f();
启动法线规范化:
glEnable(GL_MORMALIZE);
或
glEnable(GL_RESCALE_NORMALS);
建议使用第二种,第一种会在效率上有所牺牲。第二种调用告诉OpenGL,法线不是单位长度,但他们可以通过相同数量的缩放实现单位长度。
打开混合:
glEnable(GL_BLEND);
glBlendFunc(GLenum S, GLenum D);
对点、直线和多边形进行抗锯齿处理:
glEnable(GL_POINT_SMOOTH);
glEnable(GL_LINE_SMOOTH);