您的位置:首页 > 运维架构

OpenGL中创建聚光灯的效果

2014-12-29 21:43 113 查看
OpenGL中创建聚光灯的效果

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

// 指定光源位置的数组

GLfloat lightPos[] = {0.0f, 0.0f, 75.0f, 1.0f};

[align=left] // 设置光源0的位置[/align]

[align=left] glLightfv(GL_LIGHT0,GL_POSITION,lightPos);[/align]

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

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

[align=left] // 指定光源的位置和光照值[/align]

[align=left] GLfloat lightPos[] = {0.0f, 0.0f, 75.0f, 1.0f};[/align]

[align=left] GLfloat ambientLight[] = {0.5f, 0.5f, 0.5f, 1.0f};[/align]

[align=left] GLfloat specular[] = {1.0f, 1.0f, 1.0f, 1.0f};[/align]

[align=left] GLfloat specref[] = {1.0f, 1.0f, 1.0f, 1.0f};[/align]

[align=left] GLfloat spotDir[] = {0.0f, 0.0f, -1.0f};[/align]

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

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





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





单调着色,低表面模拟度





平滑着色,高表面模拟度

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

本文出自杜晓萌的博客,请勿用于任何商业用途,转载请保持完整性并标明出处: http://blog.csdn.net/haohan_meng
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: