发信人: rhine (有雨无风), 信区: BorlandDev
标 题: OpenGL在C++Builder中的应用(8)
发信站: 哈工大紫丁香 (Sun Aug 27 06:44:52 2000), 转信
发信人: jinchao (Sonic), 信区: BCB
发信站: BBS 水木清华站 (Fri Jul 30 09:14:45 1999) WWW-POST
(八)材质
物体表面的颜色不仅与光照有关,还与物体的材质属性有关,OpenGL中设置材质属性
的函数为:
void glMaterial{if} (Glenum face,Glenum pname,TYPE param);
void glMaterial{if}v (Glenum face,Glenum pname, TYPE *param);
其中face可为GL_FRONT,GL_BACK,GL_FRONT_AND_BACK,分别表示当前材质作用与物
体的哪一面 ,pname为属性名称,属性值由param给出:
属性名称 意义 默认值
——————————————————————————
GL_AMBIENT 对环境光的反射率 (0.2,0.2,0.2,1.0)
GL_DIFFUSE 对散射光的反射率 (0.8,0.8,0.8,1.0)
GL_AMBIENT_AND_DIFFUSE 对环境和散射光的反射率
GL_SPECULAR 镜反射颜色 (0.0,0.0,0.0,1.0)
GL_SHININESS 镜反射指数 0.0
GL_EMISSION 发射颜色 (0.0,0.0,0.0,1.0)
GL_COLOR_INDEX 环境、散射和反射索引 (0,1,1)
1.对散射光和环境光的反射
分别用材质对RGBA的反射率表示,它们直接影响材质的颜色,在现实世界中,这两个
反射率是相同的,因此通常用GL_AMBIENT_AND_DIFFUSE来赋值,例如
GLfloat mat_amb_diff[]={0.1,0.5,0.8,1.0};
glMaterialfv(GL_FRONT,
GL_AMBIENT_AND_DIFFUSE,mat_amb_diff);
2. 镜面反射
表面比较光洁的材质会由于反射光线而产生亮斑,GL_SPECULAR用于控制亮斑
的颜色,GL_SHININESS用于控制亮斑的亮度和大小,此时param取值范围为[0.0,128.0],
该值越大则亮斑越小且越亮。
3.发射光
有些材质自身会发出光线,可用GL_EMISSION控制发射光线的RGBA颜色
材质也是一种"当前值",当定义好一种材质后以后所绘制的物体都使用该材质,因此
有时会频繁的调用glMaterial*()函数以改变当前材质,使程序的效率降低,如果我们只
需要改变材质属性中的一项,则可使用另一个函数
void glColorMaterial(Glenum face,Glenum mode);
参数face指定物体的面,参数mode指定材质属性名,取值为GL_AMBIENT,GL_DIFFU
SE,GL_AMBIENT_AND_DIFFUSE(缺省值),GL_SPECULAR或GL_EMISSION之一,使用该函数后可
直接以用glColor*()函数改变该属性的颜色,例如:
glColorMaterial(GL_FRONT,GL_DIFFUSE);
glEnable(GL_COLOR_MATERIAL); //记得用该句使该功能生效
glColor3f(0.3,0.5,0.7);
//将当前材质的Diffuse设置为(0.3,0.5,0.7,1.0)
//绘图函数....
glColor3f(0.0,1.0,0.0);
//将当前材质的Diffuse设置为(0.0,1.0,0.0,1.0)
//绘图函数....
glDisable(GL_COLOR_MATERIAL); //关闭该功能
当仅需改变材质的某一属性时,这种方法最高效,如果要同时改变多中属性最
好用glMaterial*()函数。
下节是一个较复杂的例子,是灯光和材质应用的综合
--
念天地之悠悠,
独沧然而泪下,
知我者谓我心忧,
不知我者谓我何求......
--
☆ 来源:.哈工大紫丁香 bbs.hit.edu.cn.[FROM: rhine.bbs@smth.org]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:7.610毫秒