发信人: 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毫秒