OpenGL系统设计-光照与材质(4)

 

 材质

在现实世界中,物体本身也具有它自己的颜色,不过物体的颜色和光源的颜色不同。物体的颜色是通过其对光的反射来表征的,物体对光的反射和透射(透明物体)决定了物体所呈现的颜色。例如,红色的玻璃只是玻璃对红色反射的量多一些,对绿色和蓝色反射的少一些。

事实上,我们看到的红色的玻璃,严格来说,并不是该玻璃的颜色是红色的,而应该说该玻璃是由反射红色光的材质作成的。

 

材质的颜色也分为环境光反射、漫反射和镜面反射部分。材质的定义函数是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_BACKGL_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_INDEXESGL_SHININESS是有效的。

 

材质属性参数可以在任何时候更改,并且,glMaterial()还可以在glBegin()glEnd()之间调用。如果要逐个更改每一个顶点的材质属性,使用glColorMaterialglMaterial更加有效。

如果要得到当前材质的属性,可以使用glGetMaterial

 

你可能感兴趣的:(OpenGL系统设计-光照与材质(4))