码迷,mamicode.com
首页 > 其他好文 > 详细

OpenGL中创建聚光灯的效果

时间:2014-12-29 23:07:13      阅读:442      评论:0      收藏:0      [点我收藏+]

标签: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中的光源本身无法被直接看到。聚光灯并没有创建可见的光锥,平行光也没有创建平行的光束。为了在OpenGL中创建这些效果,我们必须绘制相关的几何图形。

     技术分享技术分享
                单调着色,低表面模拟度

     技术分享技术分享
               平滑着色,高表面模拟度

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


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


OpenGL中创建聚光灯的效果

标签:opengl   聚光灯   平行光   顶点光照   

原文地址:http://blog.csdn.net/haohan_meng/article/details/42245799

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!