OpenGL学习笔记(3)——光照

OpenGL通过定义光源、材料和光照模型属性来渲染光照物体,其中GL_AMBIENT、GL_DIFFUSE、GL_SPECULAR属性是光源和材料都有的,用glLight*()可以分别设置光的环境强度、散射强度、镜面强度,用glMaterial*()可以分别设置环境的相对应的各个属性,具体的解释参见OpenGL入门学习第七课或者OpenGL编程指南第五章。除此之外,光源还可以通过GL_POSITION属性设置光源所在的位置,通过GL_SPOT_DIRECTION(有三个值,表示一个向量,即光源发射的方向)、GL_SPOT_EXPONENT(GL_SPOT_EXPONENT属性只有一个值,表示聚光的程度,为零时表示光照范围内向各方向发射的光线强度相同,为正数时表示光照向中央集中,正对发射方向的位置受到更多光照,其它位置受到较少光照。数值越大,聚光效果就越明显。)、GL_SPOT_CUTOFF(GL_SPOT_CUTOFF属性也只有一个值,表示一个角度,它是光源发射光线所覆盖角度的一半,其取值范围在0到90之间,也可以取180这个特殊值。取值为180时表示光源发射光线覆盖360度,即不使用聚光灯,向全周围发射)这三个属性设置聚光灯。

GL_POSITION属性。表示光源所在的位置。由四个值(X, Y, Z, W)表示。如果第四个值W为零,则表示该光源位于无限远处,前三个值表示了它所在的方向。这种光源称为方向性光源,通常,太阳可以近似的被认为是方向性光源。如果第四个值W不为零,则X/W, Y/W, Z/W表示了光源的位置。这种光源称为位置性光源。对于位置性光源,设置其位置与设置多边形顶点的方式相似,各种矩阵变换函数例如:glTranslate*、glRotate*等在这里也同样有效。方向性光源在计算时比位置性光源快了不少,因此,在视觉效果允许的情况下,应该尽可能的使用方向性光源。通过调用glLightfv(GL_LIGHTi, GL_POSITION, position)所设定的光源位置就是观察点与照明源的x、y和z的距离。在视图变换之前设置光源位置,就会以相同的方式同时影响光源和观察点。

材料还有GL_SHININESS(镜面指数)、GL_EMISSION(材料的发射颜色)等属性。

光照模型通过函数glLightModel*来进行设置。该函数有两个参数,第一个表示要设置的项目,第二个参数表示要设置成的值。
GL_LIGHT_MODEL_AMBIENT表示全局环境光线强度,由四个值组成。
GL_LIGHT_MODEL_LOCAL_VIEWER表示是否在近处观看,若是则设置为GL_TRUE,否则(即在无限远处观看)设置为GL_FALSE。
GL_LIGHT_MODEL_TWO_SIDE表示是否执行双面光照计算。如果设置为GL_TRUE,则OpenGL不仅将根据法线向量计算正面的光照,也会将法线向量反转并计算背面的光照。
GL_LIGHT_MODEL_COLOR_CONTROL表示颜色计算方式。如果设置为GL_SINGLE_COLOR,表示按通常顺序操作,先计算光照,再计算纹理。如果设置为GL_SEPARATE_SPECULAR_COLOR,表示将GL_SPECULAR属性分离出来,先计算光照的其它部分,待纹理操作完成后再计算GL_SPECULAR。后者通常可以使画面效果更为逼真(当然,如果本身就没有执行任何纹理操作,这样的分离就没有任何意义)。

你可能感兴趣的:(OpenGL学习笔记(3)——光照)