材质
在现实世界中,物体本身也具有它自己的颜色,不过物体的颜色和光源的颜色不同。物体的颜色是通过其对光的反射来表征的,物体对光的反射和透射(透明物体)决定了物体所呈现的颜色。例如,红色的玻璃只是玻璃对红色反射的量多一些,对绿色和蓝色反射的少一些。
事实上,我们看到的红色的玻璃,严格来说,并不是该玻璃的颜色是红色的,而应该说该玻璃是由反射红色光的材质作成的。
材质的颜色也分为环境光反射、漫反射和镜面反射部分。材质的定义函数是glMaterial,和光源定义函数类似,其原型如下:
void glMaterialf(
GLenum face,
GLenum pname,
GLfloat param
);
void glMateriali(
GLenum face,
GLenum pname,
GLint param
);
void glMaterialfv(
GLenum face,
GLenum pname,
const GLfloat *params
);
void glMaterialiv(
GLenum face,
GLenum pname,
const GLint *params
);
其中face 表示材质需要更新的表面,取值必须是GL_FRONT, GL_BACK或者 GL_FRONT_AND_BACK。GL_FRONT表示只作用于材质的前表面,GL_BACK表示只作用于材质的后表面,GL_FRONT_AND_BACK表示同时作用于材质的前后表面。
pname 表示需要更新的表面的参数,pname取值和对应的params含义如下表7-1所示。
表7-1 glMaterial参数含义
pname | params |
GL_AMBIENT | params 参数表示材质对环境光反射的RGBA值,前后表面的缺省值都是 (0.2, 0.2, 0.2, 1.0)。 |
GL_DIFFUSE | params 参数表示材质对漫射光的反射RGBA值,前后表面的缺省值都是 (0.8, 0.8, 0.8, 1.0)。 |
GL_SPECULAR | params 参数表示材质对镜面光的反射RGBA值,前后表面的缺省值都是 (0.0, 0.0, 0.0, 1.0)。 |
GL_EMISSION | params 参数表示材质辐射光RGBA值,前后表面的缺省值都是 (0.0, 0.0, 0.0, 1.0)。 |
GL_SHININESS | params 参数表示材质的镜面指数,取值范围是[0,128],当取值为128时,则表示该材质是一完全镜面。缺省值为0。 |
GL_AMBIENT_AND_DIFFUSE | 相当于调用了glMaterial两次,一次使用的是GL_AMBIENT,一次使用的是GL_DIFFUSE。 |
GL_COLOR_INDEXES | params 参数表示环境光、漫射光、镜面光的颜色索引。当使用颜色索引表光照模式时,对材质的设置只有CL_COLOR_INDEXES和GL_SHININESS是有效的。 |
材质属性参数可以在任何时候更改,并且,glMaterial()还可以在glBegin()和glEnd()之间调用。如果要逐个更改每一个顶点的材质属性,使用glColorMaterial比glMaterial更加有效。
如果要得到当前材质的属性,可以使用glGetMaterial。