OpenGL学习笔记:光照

人眼看见物体,是因为光线直接或间接的从那里到达了眼睛。

人眼对光线强弱变化很敏感,胜过于颜色变化。

现实生活中,有些物体本身就可以发光,比如太阳,而有的,只会反射光,如木头。

OpenGL光照系统:
OpenGL对光线的模拟如下:在光照系统中,分为三部分, 光源(light) (发光的东西), 材质(material) (发射光的东西),还有 光照环境(ambient) (微调的参数,计算机很难模拟真实的光线情况,比如一些光线经过多次反射后,已经无法分清它究竟是由哪个光源发出,这时,指定一个“环境亮度”参数,可以使最后形成的画面更接近于真实情况)

物体的反射有 镜面反射(specular) 漫反射(diffuse) ,在OpenGL中有设置,现实生活中的物体在反射光线时,并不是绝对的镜面反射或漫反射,但可以看成是这两种反射的叠加。
1. 对光源设置镜面反射和漫反射强度。
2. 对材质设置镜面反射和漫反射强度。
综合结果就构成了最终光照效果

OpenGL默认关闭光照,需要使用glEnable(GL_LIGHTING)来打开它。

法线向量(glNormal):
法线向量用在光照中,是指光线垂直入射的方向向量,像图像一样,需要指定每个顶点的法线向量。因此,对于指定的物体,指定了光源后,就可以根据法线计算出光的反射方向,进而计算出光照效果。
在使用了法线向量的场合,应尽量避免使用glScale*函数。即使使用,也最好保证各坐标轴进行等比例缩放。因为glScale*函数,对每一坐标轴进行不同程度的缩放,很有可能导致原来所设置的法线向量达不到想要的效果。

控制光源:
光源有以下属性,通过glLight设置:
1. 光源位置。GL_POSITION, 用四位齐次坐标显示,X,Y,Z,W. W为0表示无限远。你懂的。方向性光源(w为0)在计算时比位置性光源(w不为0)快不少,往往都采用方向性光源
2. 发光的反射属性(颜色)。有三种颜色。GL_AMBIENT、GL_DIFFUSE、GL_SPECULAR。每个属性使用RGBA表示。GL_AMBIENT表示光在经过多次反射无法计算时,最终遗留在环境中的颜色。GL_DIFFUSE表示光源的光在经过慢发射时的颜色,GL_SPECULAR表示在经过镜面反射时的颜色。
3. 发光的光的衰减(attenuation)因子,只对位置性光源有效。在生活中,光的强度随着距离的增加而减弱,OpenGL把减弱的趋势抽象为如下函数:

衰减因子 = 1 / (k1 + k2 * d + k3 * k3 * d)

d表示距离,光线的初始强度乘以衰减因子,就得到对应距离的光线强度。其中k1,k2,k3在程序中设置,分别是:

k1.GL_CONSTANT_ATTENUATION,常量

k2.GL_LINEAR_ATTENUATION,线性量

k3. GL_QUADRATIC_ATTENUATION,二次量.


4. 聚光灯(特殊)。有三个属性。
GL_SPOT_DIRECTION。表示光源发射的方向
GL_SPOT_EXPONENT。表示聚光的程度,为零,表示光源向四方发射的光线强度相同,值越大,就越聚得厉害
GL_SPOT_CUTOFF。设置一个角度,取值为0到90,表示光源发射光线所覆盖角度的一半,也可以取180度,表示不使用聚光灯,作为普通灯,向四面八方发射。

一个场景中可以设置任意一个光源,但OpenGL只支持数量有限的光源,一般是8个,从GL_LIGHT0到GL_LIGHT7,要用的时候使用glEnable开启。


控制材质:

材质的属性通过glMaterial设置:

1. 光的反射属性(颜色),和光源类似,可以控制材质的GL_AMBIENT、GL_DIFFUSE、GL_SPECULAR属性,指的是光线射到材质上之后,经过反射后光线的颜色。通常GL_AMBIENT和GL_DIFFUSE都取相同的值,可以达到比较真实的效果。所以有一种比较方便的办法,直接设置GL_AMBIENT_AND_DIFFUSE来设置该两个属性。

2. 粗糙程度(镜面指数)。GL_SHININESS,取值为0到128,值越小,说明材料越粗糙,反之同理。光源找到粗糙的表面上后,会产生比较大的亮点。

3. 自身发射颜色。GL_EMISSION。为了避免过于复杂的计算,OpenGL认为材质本身就会向外发射微微的光线,该光线很弱,不会影响其他物体颜色,但可以被眼睛感受得到

4. GL_COLOR_INDEXES属性,在索引模式下使用的一个属性。


控制光照模型:
光照模型通过glLightModel控制:
1. 光线颜色。GL_LIGHT_MODEL_AMBIENT,不消说啦
2. 观察点位置。GL_LIGHT_MODEL_LOCAL_VIEWER,表示在近处观看,还是在无限远出观看
3. 是否计算双面光照。GL_LIGHT_MODEL_TWO_SIDE。如果物体的反面光照也需要计算,那么就设置它
4. 颜色计算方式。GL_LIGHT_MODEL_COLOR_CONTROL。跟纹理相关。如果设置为GL_SINGLE_COLOR。则表示先计算光照,再计算纹理。如果设置为GL_SEPARATE_SPECULAR_COLOR。表示先计算所有其他光照,再计算纹理,再计算镜面反射光。这样画面效果更逼真。但没有纹理的话,就没有任何意义。

你可能感兴趣的:(生活)