OpenGL中创建聚光灯的效果

OpenGL中创建聚光灯的效果

     现在,我们使用如下的数组来指定一个光源的位置:

     // 指定光源位置的数组 
     GLfloat lightPos[] = {0.0f, 0.0f, 75.0f, 1.0f};
     // 设置光源0的位置
     glLightfv(GL_LIGHT0,GL_POSITION,lightPos);

     lightPos数组的最后一个值在此为1.0,它表示光源的实际位置就在(X,Y,Z)所表示的位置。在默认情况下,光线从这个位置均匀地向四周发射。如果我们把lightPos数组的最后一个值设为0.0,可以使光源看上去像是来自无限远处,并沿着向量(X,Y,Z)所指定的方向射入。这种看似来自无限远处的光源称为方向性光源,它会均匀地照射在物体的表面,它的所有光线都是平行的,是一种平行光。反之,对于位置性光源,光线会从光源处向不同方向发散开来。

     接下来,我们通过设置一些参数,来实现聚光灯的效果,代码如下所示:

      // 指定光源的位置和光照值
 GLfloat lightPos[] = {0.0f, 0.0f, 75.0f, 1.0f};
 GLfloat ambientLight[] = {0.5f, 0.5f, 0.5f, 1.0f};
 GLfloat specular[] = {1.0f, 1.0f, 1.0f, 1.0f};
 GLfloat specref[] = {1.0f, 1.0f, 1.0f, 1.0f};
 GLfloat spotDir[] = {0.0f, 0.0f, -1.0f};

  // 执行场景的初始化设置
 void  SetupRC()
 {
     ...
  
      // 启用光照计算
      glEnable(GL_LIGHTING);
      // 设置微弱的环境光,使物体可见
      glLightModelfv(GL_LIGHT_MODEL_AMBIENT, ambientLight);
      // 设置光源0的散射光和镜面光成分
      glLightfv(GL_LIGHT0,GL_DIFFUSE,ambientLight);
      glLightfv(GL_LIGHT0,GL_SPECULAR,specular);
      // 设置光源0的位置
      glLightfv(GL_LIGHT0,GL_POSITION,lightPos);
      // 设置光源0的聚光灯效果,切角50度
      glLightf(GL_LIGHT0,GL_SPOT_CUTOFF,50.0f);
      // 启用光源0
      glEnable(GL_LIGHT0);
      // 启用颜色追踪
      glEnable(GL_COLOR_MATERIAL);
      // 设置材料属性
      glColorMaterial(GL_FRONT, GL_AMBIENT_AND_DIFFUSE);
      // 设置镜面光反射属性及强镜面指数
      glMaterialfv(GL_FRONT, GL_SPECULAR,specref);
      glMateriali(GL_FRONT, GL_SHININESS,128);
     
     ...
 }

     上述代码中的GL_SPOT_CUTOFF值指定了从聚光灯发射出来的光锥的发散角度。其中,光线是沿光锥边缘的中线发散出来的。对于一种常规的位置光源,这个角度为180度;而对于聚光灯,只有0度到90度的值是有效的。聚光灯发射一个光锥,这个锥体外面的物体并不会被照射到,如图所示:

     OpenGL中创建聚光灯的效果_第1张图片

     注意,OpenGL中的光源本身无法被直接看到。聚光灯并没有创建可见的光锥,平行光也没有创建平行的光束。为了在OpenGL中创建这些效果,我们必须绘制相关的几何图形。

     OpenGL中创建聚光灯的效果_第2张图片
                单调着色,低表面模拟度

     OpenGL中创建聚光灯的效果_第3张图片
               平滑着色,高表面模拟度

     在我们的这个示例中,增加球体的表面模拟度有助于改善光照效果,但是仍然可以看到极为不自然的人为效果,这便是顶点光照的一个缺点。通过对顶点施加光照并对它们进行匀和,我们便得到了一个粗糙的光照近似值。这种顶点光照的方法在许多情况下已经够用,但是它在有些情况下仍会显得不够充分。为了实现最佳的光照效果,必须借助着色器。 这一部分的示例程序完整代码已经放到了GitHub上,有需要的朋友可以参考一下(https://github.com/dxm3dp/OpenGL-05-Spot 点击打开链接 ), 期待更加绚丽自然的效果。


    本文出自杜晓萌的博客,请勿用于任何商业用途,转载请保持完整性并标明出处:                   http://blog.csdn.net/haohan_meng


你可能感兴趣的:(【OpenGL进阶笔记】)