`
阿尔萨斯
  • 浏览: 4150374 次
社区版块
存档分类
最新评论

在BlackBerry上使用OpenGL绘图(十二):光照

 
阅读更多

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 简化样例,不同的光照效果

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics