问题七十一:环境光遮蔽(Ambient Occlusion)
71.0 引言(Introduction)
一开始被“Ambient Occlusion”这个名字唬到了,然后又是什么“cosine distribution”和“samples on hemisphere”,感觉神乎其神。
后来,通过程序生成了相关图形之后,才恍然觉得和之前在“问题十九:怎么模拟ray tracing中漫射球体的颜色(diffuse materials)”基本是同一回事。
http://blog.csdn.net/libing_zeng/article/details/54428306
只是,之前还没有“环境光”的概念,根本没有意识到只考虑了环境光。
当时对撞击点的着色大概是这样:
在撞击点处作以单位法向量,然后以单位法向量的另一端为球心作一个单位球面;
然后在球面上随机取一点来确定入射光线的方向;
然后判断该“入射光线”是否撞击到其他物体,每撞击到一次,光线强度进行相应的衰减。
我们接下来正儿八经学习的“环境光遮蔽”,也基本是这个方法:
光线撞击物体,得到撞击点;
然后,对撞击点处的单位上半球面进行采样得到很多个采样点;
然后,撞击点分别和这“很多个采样点”组合得到“很多条阴影光线”;
若阴影光线撞击到其他物体,说明这条阴影光线对应的环境光线被其他物体挡住了,若阴影光线没有撞击到其他物体,说明这条阴影光线对应的环境光线能够顺利到达撞击点;
然后,根据顺利到达撞击点的阴影光线的条数来给撞击点进行着色。
71.1 建模(Modeling)
之前,我们认为来自各个方向的环境光的强度是一样的,不考虑环境光可能被其他物体遮挡住。对应生成的图形,则是扁平的。例如:
但是实际上,只要环境中的物体个数大于一个,物体接受的环境光就会被其他物体遮挡。如下图示意:
有一种比较实际的做法是:
对撞击点处的单位上半球面进行采样得到很多个采样点;
然后,撞击点分别和这“很多个采样点”连接得到“很多条阴影光线”;
若阴影光线撞击到其他物体,说明这条阴影光线对应的环境光线被其他物体挡住了,若阴影光线没有撞击到其他物体,说明这条阴影光线对应的环境光线能够顺利到达撞击点;
然后,根据顺利到达撞击点的阴影光线的条数来给撞击点进行着色(撞击点p处的光线强度正比于“顺利到达撞击点的阴影光线的条数”)。
根据反射函数:
由于这个原因,我们以撞击点p为球心作一个单位上半球:
71.2 C++代码实现(Implementation)
实现的方式可能很多,书上的做法是:定义一个叫做“AmbientOccluder”的新类来实现环境光遮蔽的相关操作,这个类是Light的子类,接下来将会顶替原先Ambient类的角色。
相关代码截图如下:
定义AmbientOccluder:下截图主要示意和之前Ambient不同的地方。
AmbientOccluder的具体实现相关的方法:
Phong材质的着色函数中:
Pinhole(针孔相机)的渲染函数中:
World::build()初始化函数中:
71.3 测试图形
71.3.1 第一组测试
这张开篇贴出的图形:(ka=0.5,不考虑环境光遮挡,无光源,单像素采样次数为1)
(ka=0.5,考虑环境光遮挡,无光源,单像素采样次数为1)
(就是这个鬼样子,因为使用上半球的一个随机采样点对应的光线强度作为了所有采样点的平均值,误差太大。其中的黑点:说明对应的阴影光线撞击到了其他物体,对应的原撞击点则处在阴影中,即为黑点。若将下方的绿色平面撤掉使得环境中只包含单个球面,此时就没有“环境光遮蔽”一说,因为“没有其他物体来挡住你的环境光”。如下图:)
(ka=0.5,考虑环境光遮挡,无光源,单像素采样次数为100)
(将单像素的采样次数提高到100,这样一来相当于使用了上半球上100个采样点,减小了误差)
(ka=0.5,考虑环境光遮挡,光源kd=0.5/ks=0.25/exp=20,单像素采样次数为100)
(ka=0.1,考虑环境光遮挡,光源kd=0.5/ks=0.25/exp=20,单像素采样次数为100,分别率200*200)
(ka=0.1,考虑环境光遮挡,光源kd=0.5/ks=0.25/exp=20,单像素采样次数为100,分别率400*400)
71.3.2 第二组测试
这个是“问题六十九:阴影(Shadow)”章节最后生成的图形:
(ka=0.1,不考虑环境光遮挡,光源kd=0.5/ks=0.25/exp=20,单像素采样次数为100)
然后,考虑环境光遮挡后的图形:
(ka=0.1,考虑环境光遮挡,光源kd=0.5/ks=0.25/exp=20,单像素采样次数为100)
(ka=0.5,考虑环境光遮挡,光源kd=0.5/ks=0.25/exp=20,单像素采样次数为100)
71.4 其他说明
完整的代码,参考:http://download.csdn.net/detail/libing_zeng/9764789
Referrance
[1]. Kevin Suffern, Ray Tracing from theGround Up, A K Peters Ltd, 2007.
问题七十一:环境光遮蔽(Ambient Occlusion)相关推荐
- unity学习之环境光遮挡 (Ambient Occlusion)
环境光遮挡效果可以使挨着折痕线.小孔.相交线和平行表面的地方变暗.在现实世界中,这些区域往往会阻挡或遮挡周围的光线,因此它们会显得更暗. 先来看一组效果: 环境光遮挡效果打开 环境光遮挡效果关闭 关闭 ...
- 3D建模和3D渲染技术专题一: 热身篇,光线追踪(path Tracing),环境光阴影(ambient occlusion),焦距效果(effect focus)介绍
相比大家都看到过美国迪斯尼或者梦工厂制作的一些动画片,其中很多都是使用3D图像技术来实现的,也就是说根本不用使用摄像机就能拍出一部很好的动画片.现在想开个专题主要介绍一些3D建模和3D渲染. 我之前在 ...
- dx12 龙书第二十一章学习笔记 -- 环境光遮蔽
hd之前我们在光照模型中模拟间接光的公式为:.我们利用一个相同的光量将场景中的所有元素稍微照亮一点.这里有改良的余地,这章将就流行于改善环境光项的环境光遮蔽技术展开讨论. 1.通过投射光线实现环境光遮 ...
- 光影的魔法!Cocos Creator 实现屏幕空间的环境光遮蔽(SSAO)
引言: 本文作者 alpha 从事游戏前端开发已经5年,毕业后他先是入职了腾讯无线大连研发中心,而后开启了北漂生涯,在北京的这3年一直都在使用 Cocos Creator,对前端业务,包体.内存优化有 ...
- Vulkan_SSAO—屏幕空间环境光遮蔽
屏幕空间环境光遮蔽 我们已经在前面的基础教程中简单介绍到了这部分内容:环境光照(Ambient Lighting).环境光照是我们加入场景总体光照中的一个固定光照常量,它被用来模拟光的散射(Scatt ...
- OpenGL进阶之SSAO屏幕空间环境光遮蔽
参考: https://learnopenglcn.github.io/05%20Advanced%20Lighting/09%20SSAO/ 环境光照是我们加入场景总体光照中的一个固定光照常量,它被 ...
- TSSAO Temporal Screen-Space Ambient Occlusion (Unity3d 5 示例实现)
前提 环境光(ambient occlusion)是一种GI,其简化形式SSAO可以用"微量高效"来形容,消耗得很少,得到的效果很好. 环境光遮蔽(ambient occlusio ...
- Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第二十一章:环境光遮蔽(AMBIENT OCCLUSION)
学习目标 熟悉环境光遮蔽的基本思路,以及通过光线跟踪的实现方法: 学习如何在屏幕坐标系下实现实时模拟的环境光遮蔽. 1 通过光线追踪实现的环境光遮蔽 其中一种估算点P遮蔽的方法是光线跟踪.我们随机跟踪 ...
- GPU Gems2 - 13 动态环境光遮蔽与间接光照(Dynamic Ambient Occlusion and Indirect Lighting)
本文摘自https://zhuanlan.zhihu.com/p/38411575 [章节概览] 这章在讲大家很熟知的环境光遮蔽(Ambient Occlusion , AO). 文中的描述是,介绍了 ...
最新文章
- android manifest 分辨率,android程序界面自动适应屏幕分辨率例子
- 在Eclipse上安装Activiti插件
- 采集网站特殊文件Meta信息
- 存储服务器配置型号,存储服务器配置要求指什么
- ospaf-开源项目成熟度分析工具
- 25+AI技术主题演讲及项目展示!英特尔AI全球影响力嘉年华开启,全球AI人才线上群聚
- ojective-C学习笔记(6)复合
- 结构体的成员偏移地址和字节对齐
- Oracle Coherence:分布式数据管理
- java中vo_java中的vo是什么
- 导出计算机配置信息吗,4种方式:查看电脑配置信息,没有必要用第三方软件。...
- 为什么我的订单管理里没有发货按钮?
- 单位组织机构代码提取和补零操作
- shell命令:ls命令
- HelpingKind.org:一个有偿的市场
- pythonl list 的修改元素
- 【哈佛公开课】积极心理学笔记-06乐观主义(下)
- 嵌入式计算机的应用都有哪些,嵌入式系统的应用领域有哪些?
- Don Box博客中文版入驻CSDN,志愿者翻译招募中....
- linux命令一键卸载nginx,linux服务器nginx的卸载和安装