一、光照概念
观察一个真实的3D物体,在不同的部位必然有不同的光照效果,有的地方暗一点,有的地方亮一点。而这种视觉差异是由光源和材质(物体的材料)共同决定的。光源强度由红、绿、蓝三色光强度共同决定,最终的光照效果由4部分组成:
- Emitted(光源)
- diffuse(漫反射光)
- specular(镜面反射光)
- ambient(环境光)
这里附上一张网上的图:
Emitted(光源)
物体本身所发射出的光,有的物体不发射光,那就没有这个属性
diffuse(漫反射光)
漫反射和镜面反射大家应该都知道,初中物理有讲过。
漫反射,是投射在粗糙表面上的光向各个方向反射的现象。当一束平行的入射光线射到粗糙的表面时,表面会把光线向着四面八方反射,所以入射线虽然互相平行,由于各点的法线方向不一致,造成反射光线向不同的方向无规则地反射,这种反射称之为“漫反射”或“漫射”。
如下图:
specular(镜面反射光)
镜面反射是指若反射面比较光滑,当平行入射的光线射到这个反射面时,仍会平行地向一个方向反射出来,这种反射就属于镜面反射
ambient(环境光)
在环境中进行了多次散射的光,而最终无法分辨其方向的光。
二、材质概念
物体的材质属性通过反射不同方向的环境光,漫反射光,镜面光的RGB颜色来表示的。分为四种:
- 泛射材质
- 漫反射材质
- 镜面反射材质
- 发射材质
三、光照模型
添加光照效果也就是使用OpenGL的光照模型需要以下步骤
- 打开光源
- 设置光源的种类、位置和方向(对于平行光源)
- 设置顶点的法向量
- 设置材质
1、打开光源
首先需要打开光源的总开关
//打开光源总开关
gl.glEnable(GL10.GL_LIGHTING);
在OpenGL ES中,仅仅支持有限数量的光源。使用GL_LIGHT0表示第0号光源,GL_LIGHT1表示第1号光源,依次类推,OpenGL至少会支持8个光源 。GL_LIGHT0到GL_LIGHT7。
打开0号光源
//打开0号光源
gl.glEnable(GL10.GL_LIGHT0);
2、设置光源的种类、位置和方向(对于平行光源)
设置光源的方法如下
- glLightfv(int light, int pname, FloatBuffer params)
- glLightfv(int light, int pname, float[] params, int offset)
各个参数含义如下
- light—————— 光源的序号
- pname—————— 光源属性名称
- params—————— 光源属性的值(float 数组或是Buffer类型)
- offset—————— 偏移量
params有以下几种
- GL_SPOT_EXPONENT————