分类:
2009-04-20 10:49:02
还记得下面这两行代码吗?
glEnable( GL_LIGHTING );
glEnable( GL_LIGHT0
);
第一行是在说“要有光”,于是世界就有光了。第二行是在说打开0号光源,于是世界就被在默认光源(0, 0, 1.0,
0)——照向-z轴方向的平行光——白色光照亮了。
在CG世界里,我们把光照总结成几种常用模型:环境光、平行光、点光源、聚光灯。环境光是无所不在的漫射光,是场景的背景亮度。
在OpenGL ES里,没法直接定义一个无确定方向和位置的环境光源,所以忘掉在某些3D制作软件或开发工具里放置一个环境光源的经历吧。OpenGL ES的环境光是光源本身的一个属性。
平行光是指有方向但没有具体位置的光源,比如实际生活中的日光。这种光源也被称为方向光或平面光。在OpenGL ES中可以将光源位置(x,y,z,w)中的w置为0来定义平行光源。
点光源是指有具体位置,向所有方向均匀发射光线的光源,就象实际生活中的灯泡。在OpenGL ES中的光源默认就是点光源。
聚光灯是受限的点光源,只在照射方向某个角度范围之内投射光线,并且光照的强度可能与夹角有关系。在OpenGL ES中可以通过GL_SOPT_DIRECTION, GL_SPOT_CUTOFF, GL_SPOT_EXPONENT等参数来定义一个聚光灯。
现在再来看一下OpenGL ES里定义一个光源都有哪些参数可用:
光源颜色:GL_AMBIENT 环境光RGBA强度, GL_DIFFUSE 散射光RGBA强度, GL_SPECULAR
高光(镜面反射区)RGBA强度
光源位置:GL_POSITION
(x,y,z,w)齐次坐标,w为0时为平行光,此时光照计算仅依赖于光源方向而与其位置无关,并且光线不进行衰减处理。
聚光性:GL_SPOT_DIRECTION
聚光灯光照方向,GL_SPOT_CUTOFF 最大发散角[0,90] 与方向夹角超过此范围的区域不会被光照到。
光照计算:
OpenGL
ES里光照的效果最终表现为物体表面各点的颜色,它必然要和物体表面的材质纹理合并起来。而在同一个场景里可能有多个光源,这些光源的照明效果也需要合并。
这是一个挺不错的光照试验程序,可以在PC上用来帮助理解OpenGL光照模型。作者只以源码的形式发行这个工具,在windows上可能需要借助 cygwin编译,或者有耐心的自己拿源码做个VC项目亦可。