宇宙中的物体有的是发光的,有的是不发光的,我们把发光的物体叫做光源,例如太阳电灯、燃烧着的蜡烛等都是光源。在OpenGL ES场景中至少包含8个光源,这些光源可以是不同的颜色。除0号灯之外的其他光源的颜色是黑色。
在OpenGL ES系统中,使用方法gl.glEnable()可以打开某一盏灯,其参数GL_LIGHT0、到GL_LIGHT7分别代表OpenGL ES中的8盏灯。
1.光源的类型
光源的类型有多种,在日常生活中最常见的光源类型是定向光和定位光。
(1)定向光
像太阳这类被认为是从无穷远处发射的几乎平行的光被称为定向光。定向光对应的是光源在无穷远处的光,定向光在空间中所有的位置方向都是相同的。
在OpenGL ES中通过方法glLightfv(int light,int pname,float[]params,int offset)来设定定向光,上述方法中各个参数的具体说明如下。
■ Light:该参数设定为OpenGL ES中的灯,用GL_LIGHT0到GL_LIGHT7分别来表示
8盏灯。如果该处设置为GL_LIGHT0,则表示方法glLightfv中其余的设置都是针对
GL_LIGHT0的,即对0号灯进行设置。
■ Pname:被设置的光源的属性是由Pname定义的,它指定了一个命名参数,在设置定
向光时应该设置成GL_POSITION。
■ Params:此参数是一个float数组,该数组由4部分组成,前3个值组成表示定向光方
向的向量,光的方向为从向量点处向原点处照射。如{0,1,0,0}表示沿Y轴负方向
的光。最后的0表示此光源发出的是定向光。
(2)定位光
在自然世界中定向光与定位光是截然不同的,这就像太阳与燃烧的蜡烛之间的区别。但是,在OpenGL ES中实现定向光与定位光的方法十分相似。
在OpenGL ES中通过方法glLightfv(int light,int pname,float[]params,int offset)来设定定位光,其参数和前面介绍的定向光中的glLightfv()方法类似,而且参数基本相同,仅仅是params参数略有不同。
■ 在定向光中,参数params的最后一个参数设定为0,而在定位光中,该参数设定为1
■ 在定向光中,参数params的前3个参数为设定光源的向量坐标,而在定位光中,这3
个参数是光源的位置。
■ 在定向光中光的方向为给定的坐标点与原点之间的向量,所以params中的坐标不能
设置为[0,0,0],而在定位光中给出的是光源的坐标位置,所以params前3个参数
可以设置为[0,0,0]。
2.光源的颜色
颜色是光源的一种重要的属性,在OpenGL ES中允许把与颜色相关的3个不同参数GL_AMBIENT、GL_DIFFUSE和GL_SPECULAR与任何特定的光源相关联。
(1)GL_AMBIENT环境光
Ambient表示环境光,表示一个特定的光源在场景中所添加的环境光的RGBA强度。在默认情况下是不存在环境光的,因为GL_AMBIENT的默认值是(0.0,0.0,0.0,1.0)。(www.xing528.com)
在OpenGL ES中通过方法glLightfv(int light,int pname,float[]params,int offset)来设定光源的环境光,各个参数的具体说明如下。
■ light:该参数设定为OpenGL ES中的灯,用GL_LIGHT0到GL_LIGHT7分别来表示
8盏灯。如果设置为GL_LIGHT0则表示glLightfv方法中其余的设置都是针对
GL_LIGHT0,即对0号灯进行设置。
■ pname:被设置的光源的属性是由pname定义的,对于环境光设置为GL_AMBIENT。
■ params:此参数给出的是灯光颜色的R、G、B、A四个色彩通道的值,一般环境光设
置的值均较小。
■ offset:偏移量,设置为0,表示第1个色彩通道的值在数组中的偏移量。
(2)GL_DIFFUSE散射光
因为散射光是来自于某个方向的,所以如果散射光从正面照射物体表面,它看起来就显得更亮。反之如果它斜着从物体表面掠过,则看起来就显得暗一些。但是当散射光撞击物体表面时,它就会向四面八方均匀地发散。不管从哪个方向看,散射光看上去总是一样亮。来自某个特定位置或方向的任何光很可能具有散射成分。
在OpenGLES平台中,可以通过方法gILightfv(int light,int pname,float[]params,int offset)来设定光源的散射光,各个参数的具体说明如下。
■ light:该参数设定为OpenGLES中的灯,用GL_LIGHT0到GL_LIGHT7来表示8盏
灯。如果设置为GL_LIGHT0,则表示在glLightfv()方法中其余的设置都是针对
GL_LIGHT0,即对0号灯进行设置。
■ pname:被设置的光源的属性是由pname定义的,对于环境光设置为GL_DIFFUSE。
■ params:此参数给出的是灯光颜色的R、G、B、A四个色彩通道的值。
■ offset:偏移量,设置为0,表示第1个色彩通道的值在数组中的偏移量。
(3)GL_SPECULAR镜面反射光
镜面光来自一个特定的方向,并且倾向于从表面向某个特定的方向反射。镜面光用肉眼看是物体上最亮的地方。当然这与物体本身也有关系,如果是类似镜子的或表面光泽的金属等物体,则光线为全反射,整个物体很明亮,而对于像石膏雕像、地毯等则物体几乎不存在镜面成分。
在OpenGLES中,可以使用方法glLightfv(int light,int pname,float[]params,int offset)设定光源的镜面光,各个参数的具体说明如下。
■ light:该参数设定为OpenGLES中的灯,用GL_LIGHT0到GL_LIGHT7分别来表示
8盏灯。如果该处设置的为GL_LIGHT0,即表示在gILightfv方法中其余的设置都是
针对GL_LIGHT0,即对0号灯进行设置。
■ pname:被设置的光源的属性是由pname定义的,对于环境光设置为GL_SPECULARa
■ params:此参数给出的是灯光颜色的R、G、B、A四个色彩通道的值。在镜面反射光
中,该参数一般较大。
■ offset:偏移量,设置为0,表示第1个色彩通道的值在数组中的偏移量。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。