OpenGL | 光源&材质

OpenGL在处理光照时把光照系统分为三部分,分别是光源、材质和光照模型。光源、材质和光照模式都有各自的属性,尽管属性种类繁多,但这些属性都只用很少的几个函数来设置。

  • 使用glLight*函数可设置光源的属性。

  • 使用glMaterial*函数可设置材质的属性。

  • 使用glLightModel*函数可设置光照模式。

GL_AMBIENT、GL_DIFFUSE、GL_SPECULAR这三种属性是光源和材质所共有的。

一、光源

1.环境光

环境光为一个没有光源、没有方向并且对场景中的所有物体产生相同的点亮效果的一种光。环境光的特点是:照射在物体上的光来自周围各个方向,又均匀地向各个方向反射。

2.漫反射光

漫反射光强调的是光照射到物体表面的角度对物体亮度效果的影响。漫反射光最重要的特性就是光的方向。

3.镜面反射光

镜面反射光,与其说是光本身的特性,不如说是物体的一种属性。这种属性是在入射光和观察者的视角都在某个特定的角度时会使物体高度发光,比如在晴天会看到小汽车的某个边缘会格外的发光耀眼。

光源的属性GL_SPECULAR影响镜面反射区域的颜色,一般物体的镜面反射区域的颜色为入射光线的颜色,要实现真实感,应该将它的值设置成与GL_DIFFUSE相同。
    float whiteColor[] = { 1.0f,1.0f,1.0f,1.0f };       
    glLightfv(GL_LIGHT0, GL_AMBIENT, whiteColor);        //环境光
    glLightfv(GL_LIGHT0, GL_DIFFUSE, whiteColor);        //漫反射
    glLightfv(GL_LIGHT0, GL_SPECULAR, whiteColor);       //镜面反射

二、材质

当我们使用光照来描述多边形 , 总是说它由具有某些反射属性的材质组成 , 而不说它具有特殊的颜色。这样我们指定物体的颜色 , 就必须指定物体材质对环境光、漫射光和镜面光源的反射属性。通常 , 我们用材质对光的红、绿、蓝三原色的反射率来近似定义材质属性。

像光源一样 , 材质颜色也分成环境、漫反射和镜面反射成分 , 它们决定了材质对环境光、漫反射光和镜面反射光的反射程度。

   //环境光材质 
   float ambientMat[] = { 1.0f,0.0f,0.0f,1.0f };      
   glMaterialfv(GL_FRONT, GL_AMBIENT, ambientMat);
   
   //漫反射材质,和法线有关
   float diffuseMat[] = { 0.0f,1.0f,0.0f,1.0f };      
   glMaterialfv(GL_FRONT, GL_DIFFUSE, diffuseMat);
   
   //镜面反射材质,和法线有关
   float specularMat[] = { 0.0f,0.0f,1.0f,1.0f };
   glMaterialfv(GL_FRONT, GL_SPECULAR, specularMat);
   glMaterialf(GL_FRONT, GL_SHININESS, 30.0f);  //镜面指数

三、光照计算

在进行光照计算时 , 物体的最终颜色是由其材质属性的 RGB 值和光源属性的 RGB 值共同决定的。例如,如果当前的环境光源的RGB值为 (0.5f,1.0f,0.5f ),而物体的材质的环境反射成分的RGB值为 ( 0.5f,0.5f,0.5f ) , 那么物体最终的颜色为 :

( 0.5 × 0.5 , 1.0 × 0.5 , 0.5 × 0.5 ) = ( 0.25 , 0.5 , 0.25 )

   float whiteColor[] = { 0.5f,1.0f,0.5f,1.0f };       
   glLightfv(GL_LIGHT0, GL_AMBIENT, whiteColor);        //环境光源
   float ambientMat[] = { 0.5f,0.5f,0.5f,1.0f };      
   glMaterialfv(GL_FRONT, GL_AMBIENT, ambientMat);      //环境光材质

即将每个环境光源的成分与材质的环境反射率相乘。这样,物体表面的颜色为三项 RGB值的叠加:材质对环境光的反射率与环境光结合的 RGB 值;材质对漫反射光的反射率与漫反射光结合的 RGB 值;材质对镜面光的反射率与镜面反射光结合的 RGB 值。注意,当叠加的 RGB 中任何一个颜色分量的值大于 1.0 , 那么就用1.0计算。

四、法线

1.法线影响明暗。

2.漫反射diffuse、镜面反射specular与光照方向、法线有关。

猜你喜欢

转载自blog.csdn.net/weixin_39766005/article/details/129451924