首页 > 代码库 > OpenGL中创建聚光灯的效果
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)所指定的方向射入。这种看似来自无限远处的光源称为方向性光源,它会均匀地照射在物体的表面,它的所有光线都是平行的,是一种平行光。反之,对于位置性光源,光线会从光源处向不同方向发散开来。
接下来,我们通过设置一些参数,来实现聚光灯的效果,代码如下所示:
// 指定光源的位置和光照值
上述代码中的GL_SPOT_CUTOFF值指定了从聚光灯发射出来的光锥的发散角度。其中,光线是沿光锥边缘的中线发散出来的。对于一种常规的位置光源,这个角度为180度;而对于聚光灯,只有0度到90度的值是有效的。聚光灯发射一个光锥,这个锥体外面的物体并不会被照射到,如图所示: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);// 启用光源0glEnable(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);...}
注意,OpenGL中的光源本身无法被直接看到。聚光灯并没有创建可见的光锥,平行光也没有创建平行的光束。为了在OpenGL中创建这些效果,我们必须绘制相关的几何图形。
单调着色,低表面模拟度
平滑着色,高表面模拟度
在我们的这个示例中,增加球体的表面模拟度有助于改善光照效果,但是仍然可以看到极为不自然的人为效果,这便是顶点光照的一个缺点。通过对顶点施加光照并对它们进行匀和,我们便得到了一个粗糙的光照近似值。这种顶点光照的方法在许多情况下已经够用,但是它在有些情况下仍会显得不够充分。为了实现最佳的光照效果,必须借助着色器。这一部分的示例程序完整代码已经放到了GitHub上,有需要的朋友可以参考一下(https://github.com/dxm3dp/OpenGL-05-Spot点击打开链接),期待更加绚丽自然的效果。
本文出自杜晓萌的博客,请勿用于任何商业用途,转载请保持完整性并标明出处: http://blog.csdn.net/haohan_meng
OpenGL中创建聚光灯的效果
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。