第五章 颜色、材料和光照
学习如何在3D场景中添加颜色以及平滑着色,如何指定一个或多个光源,并根据环境、散射和镜面成分定义它们的光照特征。
a) 在OpenGL中使用颜色,通过分别指定红、绿、蓝成分的强度来指定一种特定的颜色。设置绘图颜色void glColor<x><t>(red , green , blue , alpha);<x>表示参数的数量,<t>表示参数的数据类型。
b) 接着,讲讲着色,可以简单地定义为一种颜色到下一种颜色的平滑过渡(渐变)。glShadeModel(GL_SMOOTH),启用平滑着色,还有其他模式GL_FLAT,单调着色,即图元内部不进行着色技术,内部颜色就是最后一个顶点所指定的颜色。但GL_POLYGON图元,它的内部颜色是第一个顶点的颜色。
c) 现实世界的颜色 在OpenGL光照模型中,除非一个物体自己会发光,否则都会受到3种不同类型的光的照射:环境光(ambient)、散射光(diffuse)和镜面光(specular)。环境光并不来自任何特定的方向,散射光具有方向性,来自于一个特定的方向,镜面反射具有很强的方向性,只沿一个特定的方向反射。真实的颜色还有与材料有密切关系,光照和材料一齐影响才显示人眼看到的颜色。
d) 向场景添加光照 启动光照glEnble(GL_LIGHTING);设置光照模式GLfloat ambientLight[]={1.0f,1.0f,1.0f,1.0f}; ....glLightModelfv(GL_LIGHT_MODEL_AMBIENT , ambientLight);ambientLight是RGBA值;设置材料属性 GLfloat gray[]={0.75f,0.75f,0.75f,0.75f};.....glMaterialfv(GL_FRONT,GL_AMBIENT_AND_DIFFUSE,gray);另一种方法是颜色追踪,仅仅通过调用glColor来设置材料属性。代码如下:glEnable(GL_COLOR_MATERIAL); glColorMaterial(GL_FRONT,GL_AMBIENT_AND_DIFFUSE);...glColor3f(0.75f,0.75f,0.75f);随着多边形的数量增加,它的执行速度将会更快。
e) 使用光源 除了强度和颜色之外,这些光源具有位置和方向。法线是很好的充当方向这个角色,使用以下函数可以找一条法线void m3dFindNormal(M3DVector3f vNormal, const M3DVector3f vP1,const M3DVector3f vP2,const M3DVector3f vP3);设置光源glEnable(GL_LIGHT0);GLfloat lightPos[]={-50.0f,50.0f,100.0f,1.0f};.......glLightfv(GL_LIGHT0,GL_POSITION,lightPos);lightPos[]包含了光的位置,最后一个值是1.0表示指定的坐标是光源的位置,当该值为0.0时则表示光是从无限远处沿着这个数组所指定的向量照射过来的。
f) 光照效果,OpenGL提供一些有关光照效果函数:镜面光glLightfv(GL_LIGHT0,GL_SPECULAR,specular);镜面反射GLfloat specref[]=(1.0f,1.0f,1.0f,1.0f);....glMaterialfv(GL_FROAT,GL_SPECULAR,specref);镜面指数glMaterial(GL_FRONT,GL_SHININESS,128);GL_SHININESS属性设置材料的镜面指数。另外还有法线均衡(normal averaging),它可以产生一些有趣的光学幻觉,可以做一些球体。
g) 有光就离不开阴影,它可以极大的提高场景的真实性以及视觉效果。用到math3d函数库的m3dMakePlanarShadowMatrix函数,它接受的参数包括我们希望阴影所出现的平面的平面方程和光源位置,它返回这个函数所创建的一个变换矩阵。