【博物纳新】专栏是UWA旨在为开发者推荐新颖、易用、有趣的开源项目,帮助大家在项目研发之余发现世界上的热门项目、前沿技术或者令人惊叹的视觉效果,并探索将其应用到自己项目的可行性。很多时候,我们并不知道自己想要什么,直到某一天我们遇到了它。

今天推荐的项目来自UWA开源库:Unity GeoAO -- UWA问答 | 开源库 | 帮助开发者发现更好的解决方案| 侑虎科技


一、概览

AO(Ambient Occlusion)是一种基于全局照明中的环境光(Ambient Light)参数和环境几何信息来计算场景中任何一点的光照强度系数的算法。AO描述了表面上的任何一点所接受到的环境光被周围几何体所遮蔽的百分比,因此使得渲染的结果更加富有层次感,对比度更高。

该项目介绍了一种快速的基于顶点的AO算法,将AO看做模型顶点的一个属性,通过深度相机对模型多位置的采样,结合模型顶点的深度校验来计算对应的AO值。该方法相比较于SSAO,是一种比较小巧快捷的简易方法。通过对该项目的学习,读者可以初步了解AO算法的思想,也可以学到该算法的具体简化策略。

二、原理概述

总体来说,该算法可以分为两个步骤:

1.采样:通过改变深度相机的位置并对目标物体渲染,把各个位置获取到的深度图保存下来作为采样数据。
2.计算AO:将采样数据通过深度校验来识别出需要遮蔽的模型顶点并按照一定权重累加遮蔽值,以达到阴影效果。

该方法并不是一个实时计算的方法,而是一个一步到位的方法,本质上是在运行刚开始时就计算好了一个带有AO的材质并替换掉模型原有的材质。所以它并不会随着光照的改变而改变,通俗来讲就是“把容易变暗的地方的颜色画得暗一点”。

三、具体实现

从geoAO.cs来看,所有的工作都是在Start()中完成的,如下图,而采样和计算AO的主要逻辑大都在DoAO()中。

1. 采样
该步骤需要一个深度摄像机来采样深度图,摄像机的创建在CreateAOCam()中完成:

该摄像机从创建开始就是隐藏状态(148行),因为我们并不需要OnRenderImage()每帧都执行,我们想要它“按需执行”,确切来说是为了让Blit函数“按需执行”(如下图),那么我们可以通过把相机隐藏,用Camera.Render()来手动调用OnRenderImage()。

除此之外,我们也注意到为了模拟平行光效果而把摄像机模式改成了正交(150行),且开启了深度模式(158行),这时一个深度相机就已经准备完成了。

采样环节最核心的环节如下图,该部分在DoAO()函数中:

首先,该for循环的循环次数对应着采样次数,也就是最终渲染出来的深度图样本数量,而样本个数决定了AO的精度高低:

在每一轮采样过程中,AO摄像机(AOCam)作为一个单独的深度摄像机,会到达一个新的已经计算好的位置(256行),然后看向模型(257行),接着把准备好VP矩阵传给Shader,最后渲染。

这里可以注意到276行就是在手动调用OnRenderImage()函数,但其实计算AO这一步就是在276行在Shader(VertexAOCompute.shader)中进行的,相当于每一轮循环都会做一次AO运算,然后每轮得出的AO值最终会累加在一起附给一个新的材质。

2. 计算AO
AO的计算在VertexAOCompute.shader中。下图是片元着色器部分:

判断到底哪些点需要有“遮蔽”的部分就是120-121行。从118行的注释我们也可以知道,变量o“决定了遮蔽会有多暗”,而120行告诉我们,对于vertex.z和z相差过大的点,也就是被遮蔽的点,o不会参与累加(121行),因为o越大模型就会越亮。最后的累加会带上权重,只不过每次采样的权重都一样而已(124行)。

而上一步计算出的AO(65行)作为上图中的_AOTex参与了最终图像插值时的权重值(67行)。最终渲染出的图像会附着在一个新材质球上,而该材质球会替换掉模型原有材质(如下图),至此AO效果就添加到了模型上。

3. Tips
该工程计算AO的过程很直接地体现出了AO算法的思想。

概括来讲,环境遮挡被定义为从表面上某一点能够逃离场景的射线的比例。上文提到的每一轮AO采样计算相当于图中每条绿色的射线,而判断深度是在看该射线是否会被遮挡,最后的累加就是在计算比例,而这里通过样本均值来估算积分的过程也是蒙特卡洛积分思想的体现。

四、性能分析

本次测试用的是低端机型OPPO A32(4G RAM),测试分为开启和不开启GeoAO这两种情况。首先,下图显示的是开启情况下的FPS均值和GPU耗时情况:

下图是不开启该插件的情况:

可以看出即使在低端机型上,该工具的开启也没有为GPU和FPS造成压力,相反的是,GPU耗时反而比不开启的情况下要低,这是因为该插件只是在Start()函数中置换了一下物体材质,而新材质比不开启时的材质(Standard)更轻量化的缘故。

提示:并不建议在游戏中途加上该效果,因为它会由于Shader.CreateGPUProgram和AO计算而引起卡顿。其中,Shader.CreateGPUProgram的耗时可以进一步通过收集变体并预热的方式排除,可以参阅《一种Shader变体收集和打包编译优化的思路》;而剩下的AO计算部分放在场景加载阶段完成则是可以接受的开销。

综上所述,该插件是一个比较轻量级且效果尚可的方案。

作者发布项目时的介绍使用的是英文编写,为了方便大家阅读,UWA开源库已将其翻译成中文版本,欢迎大家共同学习。


今天的推荐就到这儿啦,或者它可直接使用,或者它需要您的润色,或者它启发了您的思路......

GeoAO:一种快速的环境光遮蔽方案相关推荐

  1. Unity Shader-Ambient Occlusion环境光遮蔽(AO贴图,GPU AO贴图烘焙,SSAO,HBAO)

    前言 十一放假很开心,正好赶上观望了了许久的<尼尔·机械纪元>打折啦.窝在家里搞了三天三夜,终于E结局通关啦!!!真的好久没玩过这么好玩的游戏了,于是乎我的废话应该会多不少,毕竟,写blo ...

  2. Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第二十一章:环境光遮蔽(AMBIENT OCCLUSION)

    学习目标 熟悉环境光遮蔽的基本思路,以及通过光线跟踪的实现方法: 学习如何在屏幕坐标系下实现实时模拟的环境光遮蔽. 1 通过光线追踪实现的环境光遮蔽 其中一种估算点P遮蔽的方法是光线跟踪.我们随机跟踪 ...

  3. 读《环境光遮蔽技术在图形图像中若干关键技术的研究》总结-其一

    末尾附文章引用 文章架构: 开篇先写Abstract,对本文章的研究内容进行了总结性概述: Abstract怎么写? 1.点名研究内容,研究意义,提出当下需要解决的问题. 2.讲本文章解决这些问题的思 ...

  4. DirectX11 With Windows SDK--32 SSAO(屏幕空间环境光遮蔽)

    前言 由于性能的限制,实时光照模型往往会忽略间接光因素(即场景中其他物体所反弹的光线).但在现实生活中,大部分光照其实是间接光.在第7章里面的光照方程里面引入了环境光项: C a = A L ⊗ m ...

  5. 基于区域求和表的实时体渲染环境光遮蔽和光晕技术

    对于体模型来说,很多光学效应都很难实时生成.它们可能对渲染时间有重要影响,或者它们需要预先计算,阻止了以交互方式更改传递函数,因为它决定了遮挡. 本文提出了两种在体模型上快速生成环境遮挡的方法: 第一 ...

  6. [图形学] 环境光遮蔽(AO)

    reference: <Real-Time Rendering Third Edit> 当光源照向一个大的立体角时,它会投射一个软阴影.从各个方向均匀照射的环境光将会投射出最柔和的阴影.由 ...

  7. 光影的魔法!Cocos Creator 实现屏幕空间的环境光遮蔽(SSAO)

    引言: 本文作者 alpha 从事游戏前端开发已经5年,毕业后他先是入职了腾讯无线大连研发中心,而后开启了北漂生涯,在北京的这3年一直都在使用 Cocos Creator,对前端业务,包体.内存优化有 ...

  8. GPU Gems2 - 13 动态环境光遮蔽与间接光照(Dynamic Ambient Occlusion and Indirect Lighting)

    本文摘自https://zhuanlan.zhihu.com/p/38411575 [章节概览] 这章在讲大家很熟知的环境光遮蔽(Ambient Occlusion , AO). 文中的描述是,介绍了 ...

  9. 屏幕空间环境光遮蔽(SSAO)算法的实现

    SSAO SSAO介绍 之前写SSAO的时候最后一直没达到想要的效果,最近闲下来又重新写了下,才发现自己之前真的蠢- -!(位置和法线忘转到视口坐标).这里就好好整理一下这个算法,以免下次想拿起来又不 ...

最新文章

  1. Rabbitmq 消息对列 生产者与消费者的具体实现 springboot
  2. Redhat 5.4 安装Vbox 增强工具失败解决方法。
  3. 人工智能学习--文本检测实践
  4. java缺_java – 缺少主类
  5. dubbo分布式系统链路追踪_zipkin
  6. python range倒序_Python算法学习之堆和堆排序
  7. html5+JS调用摄像头示例
  8. 麻省理工 城市规划 计算机,麻省理工学院建筑设计与城市规划科研
  9. 北理工计算机学院沈建斌,中国高校计算机大赛-团体程序设计天梯赛全国总决赛获奖.doc...
  10. JAVA修炼秘籍第三章《绝地反击》
  11. 锐取电视墙服务器型号,锐取录播系统 CL4000系列多媒体录播一体机--投影时代产品专区...
  12. 移动硬盘做pe启动盘
  13. 下采样downsample和decimate
  14. 检索器与阅读器:开放域问答的综述 Retrieving and Reading: A Comprehensive Survey on Open-domain Question Answering
  15. Google Analytics
  16. 6.汇编语言显示、指令
  17. 乔治亚州立大学如何利用算法来帮助学生通向大学之路?
  18. 几种替代MATLAB的工具,一种堪称完美!
  19. Git Stash 贮藏命令
  20. 计算机毕业论文选题推荐|软件工程|系列五

热门文章

  1. 基于超算平台气象预警并行计算架构研究
  2. 【ARCGIS创建中国南海诸岛及九段线小图框】
  3. Keepalived_vrrp[15699]: (VI_1): ip address associated with VRID 51 not present in MASTER advert : ..
  4. phpmyadmin 4.8.1漏洞复现(实战演示)
  5. 2020身高体重标准表儿童_【宝宝身高体重标准表】儿童身高体重标准表2020、2019_身高体重标准表_亲子百科_太平洋亲子网...
  6. ad服务器做虚拟化,VMware ESXi 4.1新特性之AD服务器集成
  7. 节假日期间的项目管理
  8. 信息系统安全个人笔记(xju)
  9. PMCAFF外包大师长期招募兼职团队和个人
  10. iphone6 分辨率与适配