发信人: rhine (有雨无风), 信区: BorlandDev
标  题: OpenGL在C++Builder中的应用(7)
发信站: 哈工大紫丁香 (Sun Aug 27 06:43:46 2000), 转信

发信人: jinchao (Sonic), 信区: BCB
发信站: BBS 水木清华站 (Fri Jul 30 09:12:51 1999) WWW-POST

                              (七)灯光
    在现实世界中,光与物体的作用是十分复杂的,OpenGL作为实视绘图工具不可能作到
非常准确的模拟,而是在效果与速度之间采用一种折中的办法,仅在物体的几何顶点处进
行光照计算。
    OpenGL中的光源有许多特性,主要有:
    1.  环境光颜色   光源的光经环境的多次反射,弥散在整个空间,没有确定的方向
,它照射在物体表面时在所有方向上等量反射。
    2. 散射光颜色   散射光有方向,受它直接照射的表面比受它扫射的面亮,而且从任
何方向上看,受它照射的面都是一样亮。
    3. 反射光,反射光是来自某个特定方向,并在另一个方向上反射的光线,例如高质
量的平镜会产生百分之百的反射光
    4. 另外还有光源的位置坐标,衰减指数以及专门针对于聚光灯的照射方向,聚光角
度,聚光常数等   
    这些特性都是用函数glLight*()定义的,原型如下:
        void glLight{if}(GLenum light,GLenum pname,TYPE parqm);
        void glLight{if}(GLenum light,GLenum pname,TYPE *parqm);
       其中light为光源的编号,在OpenGL中一个场景最多可定义八个光源,编号分别为
GL_LIGHT0,GL_LIGHT1, ... ,GL_LIGHT7。pname为特性名称,parqm为特性值,如下:
 
  特性名称              意义                    默认值
—————————————————————————————
GL_AMBIENT      环境光RGBA值    (0.0, 0.0, 0.0, 1.0)
GL_DIFFUSE      散射光RGBA值    (1.0 ,1.0,1.0,1.0)
GL_SPECULAR     反射光RGBA值    (1.0, 1.0, 1.0 ,1.0)
GL_POSITION     位置坐标(x,y,z,w)       (0.0, 0.0 ,1.0, 0.0)
GL_SPOT_DIRECTION       聚光灯方向(x,y,z)       (0.0,0.0,-1.0)
GL_SPOT_EXPONENT        聚光指数                 0.0
GL_SPOT_CUTOFF          聚光角度                180.0
GL_CONSTANT_ATTENUATION 常数衰减因子    1.0    
GL_LINEAR_ATTENUATION      线形衰减因子 0.0
GL_QUADRATIC_ATTENUATION        二次衰减因子    0.0
    具体方法请参看下节的例子,除定义光源外,还要定义场景的光照模式,一般要定义
以下三个部分:

    1.全局环境光   除光源发出环境光外,还可以为场景指定无源环境光,这样即使没
定义光源也不至于看不见物体,可以用下面的语句定义:
    GLfloat lmodel_ambient[]={0.2 ,0.2 ,0.2 ,1.0}
       glLightModelv(GL_LIGHT_MODEL_AMBIENT,lmodel_ambient);
    2. 观察点的位置   对于无穷远处的观察点,观察线与任意顶点之间的方向不变,这
样会减少运算量,但会使图象的质量下降,缺省观察点在无穷远处,定义观察点性质的语
句为:
     void glLightModeli(GL_LIGHT_MODEL_LOCAL_VIEW,GLbooloan param);
        当param为true时观察点为本地观察点,为false时为无穷远观察点
   3.光照面   有时场景中的物体的背面不会受到光照,例如空心球的内表面,当球被切
开时才会被照到,可用下面的函数控制是否对内表面进行运算
     void glLightModeli(GL_LIGHT_MODEL_TWO_SIDE,GLbooloan param);
     当param为true时两个面均被计算,为false是关闭双面光照模式
     
     当定义好一个光源后,应用glEnable(GL_LIGHTING);使该光源生效,还要用
glEnable(GL_LIGHT*)使具体某光源生效,其中参数可取GL_LIGHT0,GL_LIGHT1,...GL_LIG
HT7.也可用glDisable(GL_LIGHT*);使该光源失效。
     光源的内容先讲到这儿,下节继续介绍OpenGL中的重头戏——材质。光源的例子与
材质一起给出。
--
        念天地之悠悠,
        独沧然而泪下,
        知我者谓我心忧,
        不知我者谓我何求......

--
☆ 来源:.哈工大紫丁香 bbs.hit.edu.cn.[FROM: rhine.bbs@smth.org]
[百宝箱] [返回首页] [上级目录] [根目录] [返回顶部] [刷新] [返回]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:1.908毫秒