Android OpenGL ES 开发教程:设置光照效果Set Lighting

转载 2012年03月30日 18:51:09
     转自:http://www.imobilebbs.com/wordpress/?p=2453
  • 设置光源
  • 定义法线
  • 设置物体材料光学属性

光源

OpenGL ES中可以最多同时使用八个光源,分别使用0到7表示。

OpenGL ES光源可以分为

  • 平行光源(Parallel light source), 代表由位于无限远处均匀发光体,太阳可以近似控制平行光源。
  • 点光源(Spot light source)  如灯泡就是一个点光源,发出的光可以指向360度,可以为点光源设置光衰减属性(attenuation)或者让点光源只能射向某个方向(如射灯)。
  • 可以为图形的不同部分设置不同的光源。

下面方法可以打开某个光源,使用光源首先要开光源的总开关:

1
gl.glEnable(GL10.GL_LIGHTING);

然后可以再打开某个光源如0号光源:

1
gl.glEnable(GL10.GL_LIGHTI0);

设置光源方法如下:

  • public void glLightfv(int light,int pname, FloatBuffer params)
  • public void glLightfv(int light,int pname,float[] params,int offset)
  • public void glLightf(int light,int pname,float param)
  • light 指光源的序号,OpenGL ES可以设置从0到7共八个光源。
  • pname: 光源参数名称,可以有如下:GL_SPOT_EXPONENT, GL_SPOT_CUTOFF, GL_CONSTANT_ATTENUATION,  GL_LINEAR_ATTENUATION, GL_QUADRATIC_ATTENUATION, GL_AMBIENT, GL_DIFFUSE,GL_SPECULAR, GL_SPOT_DIRECTION, GL_POSITION
  • params 参数的值(数组或是Buffer类型)。

其中为光源设置颜色的参数类型为GL_AMBIENT,GL_DIFFUSE,GL_SPECULAR,可以分别指定R,G,B,A 的值。

指定光源的位置的参数为GL_POSITION,值为(x,y,z,w):

平行光将w 设为0.0,(x,y,z)为平行光的方向:

对于点光源,将 w 设成非0值,通常设为1.0. (x,y,z)为点光源的坐标位置。

将点光源设置成聚光灯,需要同时设置GL_SPOT_DIRECTION,GL_SPOT_CUTOFF等 参数,GL_POSITION的设置和点光源类似:将 w 设成非0值,通常设为1.0. (x,y,z)为点光源的坐标位置。而对于GL_SPOT_DIRECTION 参数,设置聚光的方向(x,y,z)

GL_SPOT_CUTOFF 参数设置聚光等发散角度(0到90度)

GL_SPOT_EXPONENT 给出了聚光灯光源汇聚光的程度,值越大,则聚光区域越小(聚光能力更强)。

对应点光源(包括聚光灯),其它几个参数GL_CONSTANT_ATTENUATION,  GL_LINEAR_ATTENUATION,  GL_QUADRATIC_ATTENUATION 为点光源设置光线衰减参数,公式有如下形式,一般无需详细了解:

在场景中设置好光源后,下一步要为所绘制的图形设置法线(Normal),只有设置了法线,光源才能在所会物体上出现光照效果。三维平面的法线是垂直于该平面的三维向量。曲面在某点P处的法线为垂直于该点切平面的向量

和设置颜色类似,有两个方法可以为平面设置法线,一是

public void glNormal3f(float nx,float ny,float nz)

这个方法为后续所有平面设置同样的方向,直到重新设置新的法线为止。

为某个顶点设置法线:

public void glNormalPointer(int type,int stride, Buffer pointer)

  • type  为Buffer 的类型,可以为GL_BYTE, GL_SHORT, GL_FIXED,或 GL_FLOAT
  • stride: 每个参数之间的间隔,通常为0.
  • pointer: 法线值。

打开法线数组

1
gl.glEnableClientState(GL10.GL_NORMAL_ARRAY);

用法和Color, Vertex 类似。参见Android OpenGL ES 开发教程(8):基本几何图形定义

规范化法向量,比如使用坐标变换(缩放),如果三个方向缩放比例不同的话,顶点或是平面的法线可能就有变好,此时需要打开规范化法线设置:

1
gl.glEnable(GL10.GL_NORMALIZE);

经过规范化后法向量为单位向量(长度为1)。同时可以打开缩放法线设置

1
gl.glEnable(GL10.GL_RESCALE_NORMAL);

设置好法线后,需要设置物体表面材料(Material)的反光属性(颜色和材质)。


Android OpenGL ES 开发教程(26):设置光照效果Set Lighting

上一篇简单介绍了OpenGL中使用的光照模型,本篇结合OpenGL ES API说明如何使用光照效果: 设置光源定义法线设置物体材料光学属性 光源 OpenGL ES中可以最多同时使用八个光...
  • jeanszu
  • jeanszu
  • 2012年07月19日 21:05
  • 1553

Android OpenGL ES 开发教程(26):设置光照效果Set Lighting

上一篇简单介绍了OpenGL中使用的光照模型,本篇结合OpenGL ES API说明如何使用光照效果: 设置光源定义法线设置物体材料光学属性 光源 OpenGL ES中可以最多同时使用八个光...

Android OpenGL ES设置光照效果Set Lighting

转自:http://blog.csdn.net/mapdigit/article/details/7644114

OpenGL ES 学习教程(七) 瞎子打灯,照亮他人,浅谈Ambient Lighting 环境光照

我是一个立方体,我头顶上有一个灯,但是我离灯太远了,所以你看我有一点暗淡。即时灯灭了,你也能找到我,因为还有天上的星星照耀。...

OpenGL ES 学习教程(七) 物有两面,即使前面有一盏灯,也照不透背后。解析Diffuse Lighting 漫反射光照

物有两面,即使前面有一盏灯,也照不透背后。就如同天使,华丽耀眼的天使之翼,却不能将光芒照射到阴暗的脸庞。只因为光在后面,而我在前面。...

OpenGL ES 学习教程(九) 油腻的效果 Lighting Maps 高光贴图

去哪里寻找,油腻的师姐。广告总是在脑子里绕来绕去。 虽然说师姐是油腻的,但是原画们也不会把全身都弄成油腻的效果。皮肤是油腻的,可能是涂多了护肤品精油,但是头发和衣服也油腻的话,那就可能这个人是修汽车的...

Android OpenGL ES 开发教程(27):材质及光照示例

设置物体表面材料(Material)的反光属性(颜色和材质)的方法如下: public void glMaterialf(int face,int pname,float param) publi...

Android OpenGL ES 开发教程(25):OpenGL光照模型

前面绘制球体时Android OpenGL ES 开发教程(22):绘制一个球体 ,为了能看出3D效果,给场景中添加光源。如果没有光照,绘出的球看上去和一个二维平面上圆没什么差别,如下图,左边为有光照...

opengl es 光照效果,材质设置

之前讲到了opengl es基本图形的绘制,变换,下面我们来看看光照和材质的应用。              光照模型:              为图形添加光照,就能使图形看上去有立体效果。在 Op...

【Android开发学习18】Android OpenGL ES 光照glDrawArrays

一、基础知识: 1..光照介绍: ①环境光:  来自四面八方,所有场景中的对象都处于环境光的照射中。 ②漫射光:  由特定的光源产生,并在场景中的对象表面产生反射。  处于漫射光直接照...
  • ypist
  • ypist
  • 2013年02月23日 11:09
  • 1252
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android OpenGL ES 开发教程:设置光照效果Set Lighting
举报原因:
原因补充:

(最多只允许输入30个字)