在BlackBerry上使用OpenGL绘图(十二):光照
2011-09-27 14:10
393 查看
12光照
光照在3D世界中非常重要,在不设置光照的情况下很多模型都无法体现它的真正体积。在OpenGLDemo样例中,当立方体旋转时我们可以看到立方体不同面的明暗效果,这就是光照的作用。要在OpenGL中使用光照,首先要启用光照支持。启用光照支持同样是通过调用glEnable实现,在参数中需要传入GL10.GL_LIGHTING常量,表示所要启动的是光照效果。OpenGLDemo样例中光照效果是在CubeRenderer的contextCreated方法中启用的,代码如下:
gl.glEnable(GL10.GL_LIGHTING);
启用光照支持后需要指定光源,OpenGL缺省提供8个光源,由GL10.LIGHT0,GL10.LIGHT1,…,GL10.LIGHT7这8个常理代表。需要指定光源的时候通过调用glEnable实现,在参数下传入GL10.LIGHT0,GL10.LIGHT1,…,或者是GL10.LIGHT7中的一个。OpenGLDemo样例在CubeRenderer的contextCreated方法中通过以下代码启用了光源GL_LIGHT0。
gl.glEnable(GL10.GL_LIGHT0);
OpenGLDemo样例在启用了光源GL_LIGHT0以后直接使用它的缺省设置,没有对光源的位置,方向,类型进行设置。但实现编程中缺省设置的光源往往不能满足需求,开发人员需要修改光源的属性。光源属性的修改通过方法glLightfv实现,该方法接受三个参数。第一个参数是需要修改的光源,参数可以是LIGHT0到LIGHT7中的任一个值。第二个参数是需要修改的属性名,光源不同属性的名称在GL10中以不同的常量表示,如GL10.GL_POSITION表示需要修改光源的位置属性。第三个参数是属性值,针对不同的属性名,该参数的具体作用不同,但是不管修改什么属性,第三个参数都是接受一个浮点数组。开发人员需要根据自己指定的属性名确定该浮点数组的具体内容,如果指定的内容不符合对应属性的要求,系统会抛出异常。
光源的属性比较复杂,在简化样例中我们只增加最简单的属性,位置属性。就是我们对光源LIGHT0的位置进行修改。
如上所述,需要修改光源LIGHT0的位置的话需要调用glLightfv方法。第一个参数为LIGHT0,指定修改LIGHT0的属性。第二个参数为GL10.GL_POSITION,指定需要修改光源的位置。第三个参数为对应的浮点数组。
光源位置的浮点数组由四个成员构成,前面三个分别是光源的X,Y,Z坐标值,第四个为成员是齐次坐标中w的值,目前不考虑齐次坐标,可以直接将它设置成1.0。
如果我们希望在简化样例中将光源设置在模型的右上角位置的话,则对应的浮点数组为{x,y,-3.5,1}。其中Z值设置为-3.5是因为简化样例中我们通过glTranslatef(0,0,-3.5f)将模型中心设置在了Z轴的-3.5的位置上。浮点数组中的x和y多大取决于你希望将光源放多远,只要x和y相等,同时都大于0,则光源位置就在模型的正右上方。
修改之后的简化样例代码片段如下:
gl.glTranslatef(0, 0, -3.5f);
gl.glRotatef(_angle, 1.0f, 1.0f, 0.0f);
float[] _lightPosition = { 30f,30f,-3.5f,0 };
FloatBuffer bufferLight = ByteBuffer.allocateDirect(
_lightPosition.length * 4).asFloatBuffer();
bufferLight.put(_lightPosition);
bufferLight.rewind();
gl.glLightfv(GL10.GL_LIGHT0, GL10.GL_POSITION, bufferLight);
运行结果如图18-13,其中左图是将光源设置在模型右上角的效果,右图是LIGHT0缺省位置的效果。
图18-13 简化样例,不同的光照效果
相关文章推荐
- 在BlackBerry上使用OpenGL绘图(五):动画的产生
- 在BlackBerry上使用OpenGL绘图(八):模型的运动
- 在BlackBerry上使用OpenGL绘图(汇总)
- 在BlackBerry上使用 OpenGL绘图(一): OpenGL介绍
- 在BlackBerry上使用OpenGL绘图(六):3D变换介绍
- 在BlackBerry上使用OpenGL绘图(九):投影变换
- 在BlackBerry上使用OpenGL绘图(七):视图变换:观察点的运动
- 在BlackBerry上使用OpenGL绘图(十):视口变换
- iPhone开发基础教程笔记(十二)--第十二章 使用Quartz和OpenGL绘图
- 在BlackBerry上使用OpenGL绘图(二):运行OpenGL样例
- 在BlackBerry上使用OpenGL绘图(三):OpenGL样例结构分析
- 在BlackBerry上使用OpenGL绘图(四):顶点数组与法向量数组
- 在BlackBerry上使用OpenGL绘图(十一):纹理数组
- iPhone开发基础教程笔记(十二)--第十二章 使用Quartz和OpenGL绘图
- Delphi使用OpenGL2d绘图之画图片Bmp的方法
- OpenGL光源光照使用范例
- OpenGL 使用光照来表现立体感
- 在多文档应用程序中使用OpenGL绘图
- OpenGL学习: 光照系列3-光源类型和使用多个光源
- 《iPhone开发基础教程》第12章 使用Quartz和OpenGL绘图