【技术美术图形部分】AO理论及优化 AO贴图如何参与渲染
写在前面
昨天从美术的角度出发,对AO贴图参与到次世代建模流程中的过程进行了学习。今天从图形学角度学习环境光遮蔽。
封面图截取自实时渲染GI|Ambient Occlusion:AO、SSAO、HBAO
1 AO
AO,即Ambient Occlusion,环境光遮蔽(感觉叫间接光遮蔽更好kkk),被设计出来模拟全局光照,模拟物体之间产生的阴影,在不打光的时候就能增加体积感。它是实现全局光照中部分物体局部光照和阴影真实化的一种技术方式,函数实现方式并非严格遵循现实的物理模型,但其效率高、效果好的优点还是被当前游戏广泛采用(叙述参考自环境光遮蔽)。
1.1 AO技术的发展*
这里可能题外话比较多,不仅仅是游戏层面的。
- 3D软件:实际上,AO这项技术是在2002年被提出的,早期应用在了各种3D软件上,需要预渲染、速度还慢,并没有一开始就用在游戏上
- 动画:2005年获得奥斯卡提名的《鲨鱼故事》(Shark Tale)运用了类似原理的Ambient Occlusion技术
- 绘画领域:AO画法——通过绘制AO图层来获得3D绘画效果
- 游戏:AO技术(SSAO)真正用于游戏其实是在2007年
接下来涉及的内容都会是游戏领域的应用了。
1.2 AO解决的问题
这部分可以结合2.2小节一起理解。
补足光线弹射的不足
对于游戏画面来说,如果不开AO,系统默认唯一光源是太阳or月亮,其他在现实生活中本应该是真实光源的火把、路灯等,本身都是可以小范围、固定的阴影,但在游戏制作中为了节省性能肯定不会每个光源都给个真实的点光源,一般都是一个个模型(总不能每个小光源都渲染出来吧),这样这些小范围光源产生的阴影一定是没办法渲染出来的。需要AO去帮助解决。
物体凹凸感
对于一些有细节雕刻的物体,例如大的建筑物,如果不开SSAO,整个物体表面看上去会很“平”、没有凹凸感,就像是一张平平的贴图(但其实低模实际上就是平平的kkk),不真实。开SSAO后,那种凹凸感就出来了。
拿老头环画面举例(用了《艾尔登法环》PC版优化指南提供的素材,侵删):
2 AO理论
AO Theory虽古早但不能不学!AO理论衍生自反射方程——AO影响光照计算的过程与漫反射和高光反射都有联系。
2.1 讨论反射方程
(我不确定这里能不能这样取标题,但我觉得本身AO就是在间接光层面给直接光照一个补充的,所以这样取问题应该不大吧。)
拿漫反射来说,以一个Lambert表面为例,计算表面接受来自一整个半球各个方向的入射光线,即辐亮度。在不考虑AO的情况下,出射光的辐亮度与入射到表面的辐照度(Irradiance)成正比,辐照度只与着色点位置和着色点法线方向有关。再假设各个方向入射的辐亮度(Radiance)是一个常量,则计算整个半球面上的辐照度:
和出射光的辐亮度的计算公式为
其中,BRDF中的漫反射项,与传统模型简单的diffuse不同,是储存物体albedo材质的颜色,RGB三个通道,为一个Vector3f量。
计算完辐亮度后,物体表面某点的辐射(光照)强度为:
由于是个恒值,所以会呈现出一个光滑的物体表面。于是,当一个场景(仅漫反射)不加入AO渲染,由于漫反射Radiance是常量,这意味着场景中只要有光源,所有物体表面着色效果都一样,下图(图截取自参考文章)是漫反射+阴影后的效果:
计算时认为光照不到的物体直接全部处在阴影下,跟阴影融为一体了,并没有考虑到可见性的影响,先放上加入AO后的效果(图源仍然是参考文章):
2.2 讨论可见性
这里的可见性我没有找到明确的解释,我的理解分为3个层面:
- 物体处于阴影下的软阴影
- 由于光弹射(间接光)带来的可见性
- 丰富物体凹凸感效果
处于阴影下的软阴影
在真实世界中,特别是一个场景中有多光源的影响,即使是处在其他物体阴影下的物体,还是会向周围投射一定的软阴影,如上图的这个小细节:
本应该处于太阳光照射下阴影中的桌面,还是会向地面投射淡淡的软阴影。这样做是可以丰富人物、物体的立体感的,不至于带来悬浮、失真的非真实感。
光弹射带来的可见性
写到这里才发现,这两条实际上都是属于间接光范畴,我分得有失偏颇,但确实更好的帮助我理解,就先这么着吧:)
上图中除了阴影部分,会发现处于太阳光阴影下的场景仍旧可见,上图应该是没有加漫反射颜色,如果上色了就感觉像是“在自身颜色基础上叠上了一层阴影的灰”的效果,这就是AO模拟全局光照的另一个体现层面。
物体凹凸感
这里在1.2小节已经提过了,就是下面这种感觉:
同样,也是增加立体感。
2.3 公式中加入AO
那我们如何考虑这个可见性?我们假设遮挡处的光线为0(并不考虑光线弹射),直接手动修正可见性:
其中, ——是一个随射线相交距离变化的量,如果沿入射方向很快收到了遮挡(有交点),则的值就越小,理解它可以结合下图(图源参考文章),
它表示了当前着色点在入射方向上的可见性,[0,1]上由不可见(完全遮蔽)到可见(无遮蔽),以此为画面增加更多的细节。单独拉出来一个积分项,那这一项就是正经的计算环境光遮蔽项了:
表示了半球面非遮蔽率,于是辐照度表示为
3 AO的优化
3.1 Bent Normal
还记得上一篇烘焙AO贴图时的过程吗?AO贴图一般会跟法线贴图一起烘焙出来,在渲染时会使用物体自身的法线去采样AO贴图。那如果想体现不同环境光照下的阴影渐变,就换个法线贴图采样——Bent Normal去采。
关于Bent Normal可以参考UE5官方的介绍:Bent Normal Maps
问题1 单一环境光照
上述AO都是假设单一环境光照,即Lambert模型中的Radiance相同。这就导致:模拟自遮挡的阴影效果不会随着物体凹凸的程度改变阴影的深浅。
用Bent Normal替代Normal做shading,可以优化上述的问题,获得更好的阴影效果。对比如下:
问题2 漏光问题
漏光问题大概是下面这种情况:
解决方案就是用Bent Normal去采样环境贴图,从更优化的方向计算采样的光线。
3.2 更好的AO系数
问题 多次弹射 MutiBounce
其次,由于推导AO时不考虑光线弹射,假设遮挡处光线为0,这将导致加上AO的效果与光追AO的效果相比会暗一点。那么如何弥补丢失的光线?
MultiBounceAO
用更好的AO系数,目前用的较多的是MultiBounceAO函数,如下:
4 AO的实现方式
实现AO,要么离线预计算要么实时Render。
4.1 AO预计算
AO贴图
- AO贴图如何烘焙
AO贴图就是预计算AO,【技术美术美术部分】AO贴图的烘焙及应用介绍了AO贴图如何烘焙及应用(3D软件中应用)。
- AO贴图如何参与到渲染中
这里结合Unity的代码来谈谈AO贴图如何参与到渲染中的,Unity Standard shader提供的放置AO贴图的参数项:
_OcclusionStrength("Strength", Range(0.0, 1.0)) = 1.0_OcclusionMap("Occlusion", 2D) = "white" {}
Unity的Standard shader将GI计算分为两部分:
- 直接光照:BRDF
- 间接光照:UnityGI
也就是整个计算为:color = Direct.diffuse + Direct.specular + Indirect.diffuse + Indirect.specular
UnityGlobalIllumination.cginc中的函数UnityGI_Base函数,计算间接光diffuse部分:
inline UnityGI UnityGI_Base(UnityGIInput data, half occlusion, half3 normalWorld)
{...o_gi.indirect.diffuse *= occlusion;return o_gi;
}
以及UnityGI_IndirectSpecular函数,计算间接光specular部分:
inline half3 UnityGI_IndirectSpecular(UnityGIInput data, half occlusion, Unity_GlossyEnvironmentData glossIn)
{...return specular * occlusion;
}
最后都有一个*occlusion, 这个参数就是通过采样AO贴图得到的结果。
结合上述代码,更能看出,AO贴图就是直接简单地将采样出的值直接与GI间接光计算结果相乘,这样AO贴图中的黑色部分就可以抑制环境光强度了,以达到环境光遮蔽的效果。
AO Volume
严格来讲这也是AO预计算技术的一种,因为是离线对需要产生AO Volume的物体做local space下的遮挡信息计算,效果对比的部分会在后面某个小节涉及。
4.2 实时Render*
离线烘焙AO,在光照计算时直接采样,这是预计算的方法。随着硬件的提升,足以支撑实时计算AO,这就是下一篇文章会讲的,基于AO衍生出的SSAO等算法。
【技术美术图形部分】AO理论及优化 AO贴图如何参与渲染相关推荐
- 【技术美术图形部分】PBR全局光照:理论知识补充
写在前面 最近做东西的流程是这样的,想实现一个风格化森林小场景,场景体现的主体是风格化树和交互草 --> 于是用了两天时间学SpeedTree做树模型 --> 用了两天时间SD做了树干贴图 ...
- 【技术美术图形部分】图形渲染管线3.0-光栅化和像素处理阶段
写在前面 开始学习<入门精要>第八章透明效果后,接触到了渲染顺序.透明度测试这些概念,才发现之前的渲染管线总结忘掉了光栅化和像素处理这两个阶段的学习记录,怪不得没什么印象...赶紧写一篇补 ...
- 【技术美术图形部分】2.2 模型与材质基础
记录之前膜拜一下这节课的大佬,才大三,我一个研二菜狗留下不学无术的泪水! May佬提到,这次课程安排的目的是给美术同学一个缓冲的空间,我的话在写这篇学习笔记就尽量加入一些自己的理解. 友情提示!才发现 ...
- 【技术美术图形部分】纹理基础1.0-纹理管线
目录 1 纹理三大问 1.1 What--针对物体表面属性进行"建模" 纹理 Texture 纹理值 Texture Value 纹素 Texels 1.2 Why--降低建模工作 ...
- 【技术美术图形部分】PBR直接光部分:Disney原则的BRDF和次表面散射模型
写在前面 补充去年遗漏下的知识.很多叙述都是参考了众多大佬的文章!因为是作为个人学习总结的博客,所以直接卑微的借鉴过来了,后面会给出所有参考的文章. 另外,放上一个忘了在哪一篇知乎评论里的截图: 说的 ...
- 【技术美术图形部分】图形渲染管线1.0-基本概念CPU负责的应用阶段
渲染分类 谈渲染管线之前,我想有必要看看渲染的分类.渲染可以按不同的分类依据进行分类: 按照渲染时机可以分成实时渲染(除了用于3D游戏还多用于工业仿真方面,注重交互性和实时性)和离线渲染(离线渲染多用 ...
- 【技术美术图形部分】2.3 HLSL常用函数
--介绍HLSL常用函数,API的使用. 想要成为合格的技术美术,一定要具备Shader开发能力,满足性能的需求,无论是技术美术的哪一个方向,HLSL都是需要点满的技能点. 参考 微软官方HLSL库: ...
- 【技术美术图形部分】图形渲染管线2.0-GPU管线概述几何阶段
图形渲染管线1.0 [技术美术知识储备]图形渲染管线1.0-基本概念&CPU负责的应用阶段 在上一篇中,从渲染分类开始介绍了什么是渲染流水线.为什么要有流水线以及流水线如何进行的,还介绍了CP ...
- 【技术美术图形部分】关于前向渲染和延迟渲染
学习参考 [技术美术百人计划]图形 3.4 延迟渲染管线介绍 <Unity Shader 入门精要> 1 Unity的渲染路径 关于渲染路径,我在图形渲染管线1.0中就提过了,但只是初步的 ...
最新文章
- PMP考试错题记录(2)
- 7.3 rpm工具用法
- python如何调用图片-python调用图片
- python拆分excel的sheet为单文件_WPS 2019 多个sheet表拆分成独立的excel文件
- Elasticsearch聚合查询案例分享
- 深入理解C# 静态类与非静态类、静态成员的区别 [转载]
- 配合Opencv2.4.9,CMake3.12.1和VS2010在win10下构建项目踩坑记录
- android 小学课程,小学课堂(小学学习软件)
- java jdbc 参数 转义_jdbc URL中的各个参数详解
- 生成26个大小写字母和0-9的六位随机验证码(python3.X)
- usb声卡驱动(五):声卡驱动的开始
- mac系统spss26软件下载及安装教程
- 一些常用的Maven命令的作用
- 101-150的质数
- html弹窗确认取消公告代码,javascript实现确定和取消提示框效果
- 数据库number 对应java_数据库中的number型表示什么
- 鸿蒙生死印作用,逆天邪神:南溟神帝要抢鸿蒙生死印已成事实,但他还有更大作用...
- 基于Java+springboot+mvc+vue员工管理系统
- 计算机如何制作表格基础,计算机基础教程(Word表格制作)
- 欢迎大家多踩踩偶的个人博客噶 哇哈哈
热门文章
- 奶茶制作APP开发模式解析
- SQL:多表级联查询数量时避免笛卡尔积
- Python+Vue计算机毕业设计大数据在线考试系统在线阅卷系统及大数据统计分析7o33p(源码+程序+LW+部署)
- 用 Python 绘制龙形曲线
- 机械专业就业与计算机专业待遇,机械类专业毕业五年“薪资”排名,车辆工程“逆袭”!...
- 思科交换机配置命令大全!
- ISO14001环境管理体系认证所需材料
- CH9121模块只有端口2有用
- ELK——企业级日志管理系统
- 2014第四届国际物联网大会