最迷人的要算灯光了,所以上帝说的第一句话就是 — “要有光”。
OpenGL ES 1.1支持最多同时启用八个灯光,可以是平行光、点光源、聚光灯。
使用灯光前,先要启用灯光总开光,然后再启用 0-7 八个光源中的某(几)盏,通过 glEnable函数可以打开这两种开关
?
1
2
|
gl.glEnable(GL10.GL_LIGHTING); // 启用灯光总开关
gl.glEnable(GL10.GL_LIGHTIn);// 启用第n盏灯 ( n = 0...7 )
|
然后通过 glLight 系统函数设置灯光属性即可,看下这几个函数
?
1
2
3
4
5
6
|
gl.glLightf(int light, intpname, float param);
gl.glLightfv(int light, intpname, float[] params, int offset);
gl.glLightfv(int light, intpname, FloatBuffer params);
gl.glLightx(int light, intpname, int param);
gl.glLightxv(int light, intpname, int[] params, int offset);
gl.glLightxv(int light, intpname, IntBuffer params);
|
这几个函数大同小异,其中x、f 表示设置的值的类型是整数还是浮点。
参数light 表示要设置哪个灯光,有效值为常量 GL10.GL_LIGHTn 。
参数pname 表示要设置的属性,包括
- GL_POSITION:灯光的位置,值为四元组 (x,y,z,w),光w为0时表示平行光,xyz即变成了光源方向;光 w不为0时,表示点光源或聚光灯的位置一般此时 w取值为1.0f。
- GL_AMBIENT,GL_DIFFUSE,GL_SPECULAR:灯光的颜色,分别代表环境光、漫射光、反射光。
- GL_CONSTANT_ATTENUATION,GL_LINEAR_ATTENUATION,GL_QUADRATIC_ATTENUATION:衰减,后两个使灯光的强度随距离变化,三者共同作用的最终衰减系数为:1/ (kconstant + klinear * d + kquadratic *d2),其中d表示到光源的距离。
- GL_SPOT_EXPONENT:设置聚光灯光圈中心到边缘的衰减程度。
- GL_SPOT_CUTOFF:设置聚光灯光锥的扩散角度。
- GL_SPOT_DIRECTION:设置聚光灯的照射方向。
参数param表示要设置的属性的整数值或浮点值。
参数params表示要设置的属性的序列值。
参数offset限定数组类型的params参数中要使用的部分的起始位置。
设置完灯光,还要在我们的模型上加上法线数据,法线即多边型平面反射光线时反射角的参考,入射角和反映角与法线的夹角相等,且入射光线、反射光线、法线在同一平面。
回到 HelloWorld 工程,加入点灯光进去。
首先我们要定义法线数据,
?
1
2
3
4
5
6
7
8
9
10
11
12
|
private float[] data_normals= { -5.0f, -5.0f, -5.0f, -5.0f, 5.0f, -5.0f,
<wbr><span style="font-size:18px"></span><wbr><span style="font-size:18px"></span><wbr><span style="font-size:18px"></span><wbr><span style="font-size:18px"></span><wbr><span style="font-size:18px"></span><wbr><span style="font-size:18px"></span><wbr><span style="font-size:18px"></span><wbr><span style="font-size:18px">5.0f,5.0f, -5.0f, 5.0f, 5.0f, -5.0f, 5.0f, -5.0f, -5.0f, -5.0f,</span></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
<wbr><span style="font-size:18px"></span><wbr><span style="font-size:18px"></span><wbr><span style="font-size:18px"></span><wbr><span style="font-size:18px"></span><wbr><span style="font-size:18px"></span><wbr><span style="font-size:18px"></span><wbr><span style="font-size:18px"></span><wbr><span style="font-size:18px">-5.0f,-5.0f, -5.0f, -5.0f, 5.0f, 5.0f, -5.0f, 5.0f, 5.0f, 5.0f,</span></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
<wbr><span style="font-size:18px"></span><wbr><span style="font-size:18px"></span><wbr><span style="font-size:18px"></span><wbr><span style="font-size:18px"></span><wbr><span style="font-size:18px"></span><wbr><span style="font-size:18px"></span><wbr><span style="font-size:18px"></span><wbr><span style="font-size:18px">5.0f,5.0f, 5.0f, 5.0f, -5.0f, 5.0f, 5.0f, -5.0f, -5.0f, 5.0f,</span></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
<wbr><span style="font-size:18px"></span><wbr><span style="font-size:18px"></span><wbr><span style="font-size:18px"></span><wbr><span style="font-size:18px"></span><wbr><span style="font-size:18px"></span><wbr><span style="font-size:18px"></span><wbr><span style="font-size:18px"></span><wbr><span style="font-size:18px">-5.0f,-5.0f, -5.0f, 5.0f, -5.0f, -5.0f, 5.0f, -5.0f, 5.0f, 5.0f,</span></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
<wbr><span style="font-size:18px"></span><wbr><span style="font-size:18px"></span><wbr><span style="font-size:18px"></span><wbr><span style="font-size:18px"></span><wbr><span style="font-size:18px"></span><wbr><span style="font-size:18px"></span><wbr><span style="font-size:18px"></span><wbr><span style="font-size:18px">-5.0f,5.0f, -5.0f, -5.0f, 5.0f, -5.0f, -5.0f, -5.0f, 5.0f, -5.0f,</span></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
<wbr><span style="font-size:18px"></span><wbr><span style="font-size:18px"></span><wbr><span style="font-size:18px"></span><wbr><span style="font-size:18px"></span><wbr><span style="font-size:18px"></span><wbr><span style="font-size:18px"></span><wbr><span style="font-size:18px"></span><wbr><span style="font-size:18px">-5.0f,5.0f, 5.0f, -5.0f, 5.0f, 5.0f, 5.0f, 5.0f, 5.0f, 5.0f, 5.0f,</span></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
<wbr><span style="font-size:18px"></span><wbr><span style="font-size:18px"></span><wbr><span style="font-size:18px"></span><wbr><span style="font-size:18px"></span><wbr><span style="font-size:18px"></span><wbr><span style="font-size:18px"></span><wbr><span style="font-size:18px"></span><wbr><span style="font-size:18px">-5.0f,5.0f, 5.0f, -5.0f, -5.0f, 5.0f, 5.0f, -5.0f, -5.0f, 5.0f,</span></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
<wbr><span style="font-size:18px"></span><wbr><span style="font-size:18px"></span><wbr><span style="font-size:18px"></span><wbr><span style="font-size:18px"></span><wbr><span style="font-size:18px"></span><wbr><span style="font-size:18px"></span><wbr><span style="font-size:18px"></span><wbr><span style="font-size:18px">-5.0f,-5.0f, 5.0f, 5.0f, -5.0f, 5.0f, 5.0f, 5.0f, 5.0f, 5.0f,</span></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
<wbr><span style="font-size:18px"></span><wbr><span style="font-size:18px"></span><wbr><span style="font-size:18px"></span><wbr><span style="font-size:18px"></span><wbr><span style="font-size:18px"></span><wbr><span style="font-size:18px"></span><wbr><span style="font-size:18px"></span><wbr><span style="font-size:18px">5.0f,5.0f, -5.0f, -5.0f, 5.0f, -5.0f, -5.0f, -5.0f, -5.0f, -5.0f,</span></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
<wbr><span style="font-size:18px"></span><wbr><span style="font-size:18px"></span><wbr><span style="font-size:18px"></span><wbr><span style="font-size:18px"></span><wbr><span style="font-size:18px"></span><wbr><span style="font-size:18px"></span><wbr><span style="font-size:18px"></span><wbr><span style="font-size:18px">-5.0f,5.0f, -5.0f, -5.0f, 5.0f, -5.0f, 5.0f, 5.0f, -5.0f, 5.0f,</span></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
<wbr><span style="font-size:18px"></span><wbr><span style="font-size:18px"></span><wbr><span style="font-size:18px"></span><wbr><span style="font-size:18px"></span><wbr><span style="font-size:18px"></span><wbr><span style="font-size:18px"></span><wbr><span style="font-size:18px"></span><wbr><span style="font-size:18px">-5.0f,};</span></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
|
然后在 createBuffers 方法中将法线装入 FloatBuffer 中
?
1
2
3
4
|
normals =ByteBuffer.allocateDirect(data_normals.length * 4);
normals.order(ByteOrder.nativeOrder());
normals.asFloatBuffer().put(data_normals);
normals.position(0);
|
在 onSurfaceCreated 方法中启用灯光总开关及0号灯光并设置灯光颜色
?
1
2
3
4
5
6
7
8
9
|
gl.glEnable(GL10.GL_LIGHTING);
gl.glEnable(GL10.GL_LIGHT0);
<wbr><span style="font-size:18px"></span><wbr></wbr></wbr>
gl.glLightfv(GL10.GL_LIGHT0,GL10.GL_AMBIENT, new float[] { 1.0f, 0.0f,
<wbr><span style="font-size:18px"></span><wbr><span style="font-size:18px"></span><wbr><span style="font-size:18px"></span><wbr><span style="font-size:18px"></span><wbr><span style="font-size:18px"></span><wbr><span style="font-size:18px"></span><wbr><span style="font-size:18px"></span><wbr><span style="font-size:18px">0.0f,1.0f }, 0);</span></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
gl.glLightfv(GL10.GL_LIGHT0,GL10.GL_DIFFUSE, new float[] { 1.0f, 1.0f,
<wbr><span style="font-size:18px"></span><wbr><span style="font-size:18px"></span><wbr><span style="font-size:18px"></span><wbr><span style="font-size:18px"></span><wbr><span style="font-size:18px"></span><wbr><span style="font-size:18px"></span><wbr><span style="font-size:18px"></span><wbr><span style="font-size:18px">1.0f,1.0f }, 0);</span></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
gl.glLightfv(GL10.GL_LIGHT0,GL10.GL_SPECULAR, new float[] { 0.0f, 0.0f,
<wbr><span style="font-size:18px"></span><wbr><span style="font-size:18px"></span><wbr><span style="font-size:18px"></span><wbr><span style="font-size:18px"></span><wbr><span style="font-size:18px"></span><wbr><span style="font-size:18px"></span><wbr><span style="font-size:18px"></span><wbr><span style="font-size:18px">1.0f,1.0f }, 0);</span></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
|
灯光的位置我们在绘制时动态设置,让它有点点旋转效果。在onDrawFrame中
?
1
2
3
4
|
gl.glMatrixMode(GL10.GL_MODELVIEW);
gl.glLoadIdentity();
gl.glRotatef(-angley, 0, 1,0);
gl.glLightfv(GL10.GL_LIGHT0,GL10.GL_POSITION, new float[]{50, 50, 50, 0}, 0);
|
绘制模型时需要启用法向量并设置法向量数据
?
1
2
|
gl.glEnableClientState(GL10.GL_NORMAL_ARRAY);
gl.glNormalPointer(GL10.GL_FLOAT, 0, normals);
|
好了, 看下效果
相关推荐
9. 增加灯光效果和材质属性 由于之前没有接触过,所以先进行了学习,然后再增加,遇到的问题是写增加灯光效果的时候,由于疏忽,三种光效属性中均写成了对环境光的修改,所以多费了些时间;在对材质属性进行增加的...
### Pro OpenGL ES for Android #### 关于本书 《Pro OpenGL ES for Android》是一本专注于介绍如何使用OpenGL ES在Android平台上创建复杂3D图形与游戏应用的专业书籍。OpenGL ES(OpenGL for Embedded Systems)...
此外,还可以通过启用光照模型来增加真实感,通过glEnable(GL_LIGHTING)和glEnable(GL_LIGHT0)开启灯光,然后设置光源的位置和特性。 最后,完成绘制后,使用glFlush()确保所有渲染操作立即完成并显示在屏幕上。...
- **2D与3D游戏开发**:通过实例教授如何基于Canvas API和OpenGL ES开发2D游戏;并介绍如何创建完整的3D游戏。 - **发布与支持**:教授游戏发布流程,包括获取崩溃报告和支持用户的方法。 - **完成可玩游戏**:指导...
通过OpenGL ES,开发者可以创建复杂的图形动画,包括灯光效果。 2. **Shader语言(GLSL)**: OpenGL ES使用着色器语言(GLSL)来处理图形的着色和光照效果。开发者可能编写顶点着色器和片段着色器,以实现动态变幻...
- OpenGL ES:可能被用于创建3D翻页效果,它是一种用于绘制2D和3D图形的标准。 - Canvas与Path:Android中的2D绘图API,可以用来绘制页面边缘和动态的翻页轨迹。 - Animation API:实现翻页动画,可能包括...
OpenGL ES(OpenGL for Embedded Systems)是 OpenGL 的子集,专为资源有限的设备设计,如智能手机和平板电脑。它提供了一个跨语言、跨平台的编程接口,用于绘制2D和3D图形。OpenGL ES 通常通过硬件加速来提高性能,...
开发者可以使用Java或者Kotlin的Android图形库与OpenGL ES进行交互,创建自定义视图来显示3D内容。此外,项目可能还依赖于Android的动画框架,如Property Animation或Transition API,来实现对话框的翻转动画。 ...
它具有图形API后端(例如OpenGL ES2 , OpenGL ES3 , OpenGL 3.3 , OpenGL 4.3 , Directx11(WIP)和Vulkan(WIP) )的运行时抽象。 它可以自动选择可用的最高后端,此外,您还可以在构建中关闭API后端,这样它就...
- 它支持OpenGLES 3.0、OpenCL 1.2和DirectX 9标准,具有出色的图形处理能力。 2. **集成的连接性功能**: - Wi-Fi支持802.11a/b/g/n标准,同时具备蓝牙、FM、GPS、Glonass、Beidou功能。 - LTE、UMTS/TD-SCDMA...
- “3D噪声”功能要求着色器功能等于或高于Shader Model 3.5 / OpenGL ES 3.0。 2012年之后发布的任何移动设备都应该支持它。 - 仅在Unity 5.5或更高版本上支持“体积粉尘颗粒”。 - “动态遮挡”功能计算遮挡的近似...