设为首页 加入收藏

TOP

OpenGL超级宝典学习笔记——阴影
2015-02-25 22:43:27 来源: 作者: 【 】 浏览:24
Tags:OpenGL 超级 宝典 学习 笔记 阴影

(又称影子背影),光线被不透明物体阻档而产生的黑暗范围,与光源的方向相反。影的横切面是二维轮廓、阻档光线物体的倒转投影。影的大小、形状随光线的入射角而改变。(维基百科)在场景中添加阴影可以使得场景更加逼真。下面两幅图是有无阴影效果的对比:


image


image


简单地做法,我们可以通过把源物体压平在物体表面所处的平面上,来制造阴影效果。然后被压平的物体用黑色或深色进行绘制。通过操作高级矩阵的方式,来把物体压平到其他表面上。


image


我们需要压平的模型视图投影矩阵,以使得所有被绘制的物体都会被压平到阴影所处的二维平面上。无论物体朝哪个方向,都会被投影到阴影所在的平面上。在此需要考虑两种情况,光源离物体的距离以及光源的照射方向。光源的方向决定了阴影的形状和大小。就像在一天中的不同时段,人站在太阳底下,影子会随着太阳的位置而变化。


在math3d库中,有一个函数m3dMakePlanarShadowMatrix,它接受的参数包括一个阴影所处平面的平面方程(3个点不能位于一条直线上),光源的位置,返回的是一个变换矩阵。用当前的模型视图矩阵乘以这个矩阵,随后的所有被绘制的物体都会被压平到这个投影平面上。


为了演示阴影的效果,我们把喷气式飞机悬空,然后在其上面放置一个光源,制造一个飞机投影到地面的阴影效果。


image


下面的例子,我们在SetupRC中创建一个阴影矩阵,并用全局变量保存它。在RenderScene中使用。


在RenderScene中,我们先绘制地面,然后画喷气式飞机。然后恢复模型视图矩阵乘以阴影矩阵,然后我们再次绘制喷气式飞机(此过程要关掉深度测试)。飞机的投影和地面处于同一个位置,在一般情况下后面画的那个物体会叠在之前的物体上面被显示。但有的时候,会导致z-figinting,从而产生混乱。


代码如下:


image


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇OpenGL超级宝典学习笔记——镜面.. 下一篇OpenGL超级宝典学习笔记——混合

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: