环境光遮蔽(Ambient Occlusion)“AO”为Amblent Occlusion的缩写,中文译为环境光遮蔽。在DirectX 10.1 API推出后,Amblent Occlusion升级为SSAO(Screen-Space Ambient Occlusion:屏幕空间环境光遮蔽);而在微软推出DirectX 11 API后,SSAO升级至HDAO(高解析度环境光遮蔽:High Definition Ambient Occlusion)。

我们有必要对AO(环境光遮蔽)的释义进行一个简单了解:AO是来描绘物体和物体相交或靠近的时候遮挡周围漫反射光线的效果,可以解决或改善漏光、飘和阴影不实等问题,解决或改善场景中缝隙、褶皱与墙角、角线以及细小物体等的表现不清晰问题,综合改善细节尤其是暗部阴影,增强空间的层次感、真实感,同时加强和改善画面明暗对比,增强画面的艺术性。可以说:

AO特效在直观上给我们玩家的感受主要体现在画面的明暗度上,未开启AO特效的画面光照稍亮一些;而开启AO特效之后,局部的细节画面尤其是暗部阴影会更加明显一些。

本章讲到了如何使用有效的实时环境光遮蔽技术,对物体遮蔽信息及环境进行预处理,综合这些因素给物体创建逼真的光照和阴影。本文大部分参考https://zhuanlan.zhihu.com/game-programming

1 概述

首先,本文中讲到,环境光遮蔽(Ambient Occlusion)一般而言有两种理解:

1)将环境光遮蔽视为“智能”的环境光项,其在模型表面的变化取决于在每点可见多少外部环境。

2)将环境光遮蔽视为一个漫反射项,其能有效地支持复杂分布的入射光线。

文中将考虑上述的第二种解释。

其基本思路是,假如预处理一个模型,计算它上面每个点可以看到多少外部环境,可以相反地计算有多少环境被模型的其他部分遮挡,然后在渲染时使用这个信息计算漫反射着色项的值。其结果是模型上的裂缝变暗,而模型的暴露部分会接收更多的光线,因此更明亮。这种效果实质上比使用标准的着色模型更逼真。

另外,这个方法可以扩展为使用环境光作为照明源,用代表各个方向入射光的环境贴图没来决定物体上每个点光的颜色。为了这个特性,除了记录在点上可以看到多少外部环境之外,也记录大部分可以光从哪个方向到达。这两个量有效地定义了从外面进入场景的未被遮挡的方向圆锥体,可以一起用来做为来自环境贴图的极端模糊的查询,模拟着色点上来自感兴趣的方向圆锥体的全部入射照度。

2 预处理步骤(The Preprocessing Step)

给定一个任意的着色模型,环境光遮蔽算法需要知道模型上每点的两个信息:

(1)该点的“可到达度(accessibility)”- 即该点上方半球的哪一部分未被模型的其他部分遮挡;

(2)未被遮挡的入射光的平均方向。

通过下图在平面上说明这两个概念。给定在表面上的点P,其法线为N,P点上半球的2/3被场景中其他几何体遮挡,半球另外的1/3不被遮挡。入射光的平均方向用B表示,其在法线N的右侧。大致来说,在P点的入射光的平均颜色,可以通过求围绕B矢量的未遮挡入射光的圆锥体的平均值得到。

下面贴出的伪代码显示了我们的基本方法。在每个三角形的中心,我们产生一组以表面法线为中心的半球形光线,跟踪每道光线进入场景,记录哪些光线与模型相交,标志不能从环境接收的光线,以及不被遮挡的光线。接着我们计算不被遮挡的光线的平均方向,这给出了入射光平均方向的近似值。(当然,我们计算的方向实际上可能会被遮挡,但我们选择忽略不计这个问题。)

Example 17-1 计算环境光遮蔽量的基本算法伪代码 (Basic Algorithm for Computing Ambient Occlusion Quantities)

For each triangle {Compute center of triangleGenerate set of rays over the hemisphere thereVector avgUnoccluded = Vector(0, 0, 0);int numUnoccluded = 0;For each ray {If (ray doesn't intersect anything) {avgUnoccluded += ray.direction;++numUnoccluded;}}avgUnoccluded = normalize(avgUnoccluded);accessibility = numUnoccluded / numRays;}

生成这些光线的简单方法是使用拒绝采样法(rejection sampling):检测在x,y和z为-1到1区间的3D立方体中随机生成的光线,并拒绝不在单位半球中与法线相关的光线。

能通过这次检测的光线方向可视分布理想的光线方向。列表17-2的伪代码表示出了此方法的实现思路。

当然,也可以用更复杂的蒙特卡洛(Monte Carlo)采样法来得到更好的样本方向的分布。

Example 17-2 使用拒绝采样法计算随机方向的算法伪代码(Algorithm for Computing
Random Directions with Rejection Sampling)

while (true) {x = RandomFloat(-1, 1); // random float between -1 and 1y = RandomFloat(-1, 1);z = RandomFloat(-1, 1);if (x * x + y * y + z * z > 1) continue; // ignore ones outside unit// sphereif (dot(Vector(x, y, z), N) < 0) continue; // ignore "down" dirsreturn normalize(Vector(x, y, z)); // success!}

另外,用图形硬件代替光线追踪软件,有可能加速遮挡信息的计算。

3 使用环境光遮蔽贴图进行渲染(Rendering with Ambient Occlusion Maps)

使用环境光遮蔽贴图进行着色的基本思想是:可以直接在着色点处使用之前已计算好的,有多少光线能到达表面的,优质的近似值信息。

影响这个数值的两个因素是:

(1)在此点上方半球的哪个部分不被点和环境贴图之间的几何体遮挡。

(2)沿着这些方向的入射光是什么。

下图显示了两种不同的情况。在左图中,只能看到着色点上面的一小部分,由方向矢量B和围绕它的方向圆锥体所表示,该点的可到达度非常低。而在右图中,沿着更大范围的方向有更多的光线到达给定点。

图 不同量的可见度的近似(左图:由于附近的几何体的遮挡比较严重,这点得到的照度较小;右图:沿着更宽方向的圆锥体,更大量的光能到达这点,照度较左图更大)

在预处理中计算的可访问性值告诉我们哪一部分半球可以看到环境贴图,而可见方向的平均值给出一个近似方向,围绕它计算入射光。虽然这个方向可能指向一个实际被遮挡的方向(例如,如果半球的两个独立区域未被遮挡,但其余的部分被遮挡,平均方向可能在这两者之间),但在实践中其通常运行良好。

有无使用环境光遮蔽贴图进行渲染的对比图

【核心要点总结】

给定一个任意的着色模型,环境光遮蔽算法需要知道模型上每点的两个信息:

1)该点的可到达度(accessibility)。

2)未被遮挡的入射光的平均方向。

文中提出的环境光遮蔽方法,总结起来有三个要点:

  • 采用了多种在实践中运行良好的近似方法。
  • 主要为预处理操作,将相对昂贵的计算事先准备好,且仅计算在渲染时进行快速着色所需的正确信息。
  • 预处理不依赖于光照环境贴图,因此可以轻松使用场景中的动态照明。

【本章配套源代码汇总表】

Example 17-1 计算环境光遮蔽量的基本算法伪代码(Basic Algorithm for Computing
Ambient Occlusion Quantities)

Example 17-2 使用拒绝采样法计算随机方向的算法伪代码(Algorithm for Computing
Random Directions with Rejection Sampling)

Example 17-3 使用可到达度和环境映射进行着色的片元Shader(Fragment Shader for
Shading with Accessibility Values and an Environment Map)

Example 17-4 latlong( )函数的定义(The latlong() Function Definition)

Example 17-5 computeBlur( )函数的定义(The computeBlur() Function Definition)

【关键词提炼】

环境光遮蔽(Ambient Occlusion)

拒绝采样(Rejection Sampling)

环境光遮蔽贴图(Ambient Occlusion Maps)

GPU Gems1 - 17 环境遮挡相关推荐

  1. GPU Gems1 - 13 使用遮挡区间映射产生模糊的阴影(Generating Soft Shadows Using Occlusion Interval Maps)

    这章介绍了一种渲染软阴影的技术,称为遮挡区间映射(Occlusion Interval Maps),能够正确地在静态场景中渲染出光源沿着预定路径移动时产生的模糊阴影.之所以叫遮挡区间映射,是因为此算法 ...

  2. URP——后期处理特效——环境遮挡Ambient Occlusion

    Ambient Occlusion 环境遮挡效果使折痕.洞.交叉点和彼此靠近的表面变暗.在现实世界中,这些区域往往会遮挡或遮挡环境光,所以它们看起来更暗. URP实现了实时屏幕空间环境遮挡(SSAO) ...

  3. 在线GPU分布式实验环境+企业级项目,轻松斩获offer

    前 言 开课吧AI学院在前四期具有求职意向的同学中,已经有80%的同学拿到了国内外名企的AI算法岗位offer,或者国外名校的AI 硕士.全奖博士录取 offer. 在大家的认可下,我们对课程做了全面 ...

  4. openacc的Linux安装教程,科学网—opensuse 13.1 系统 openACC编译器使用及GPU并行编程环境配置 - 马小军的博文...

    本文讲述opensuse13.1系统openACC编译器使用及GPU并行编程环境配置. 这里以笔记本显卡驱动为NVIDIA为例 在安装前,请确保系统已经安装kernel-devel ,kernel-s ...

  5. [Python人工智能] 二十四.易学智能GPU搭建Keras环境实现LSTM恶意URL请求分类

    最近用笔记本跑Keras和TensorFlow深度学习代码,一个模型跑十几个小时还奔溃,真的头大!这篇文章简单讲解易学智能GPU搭建Keras环境的过程,并实现了LSTM文本分类的实验,本来想写Goo ...

  6. activeperl安装不成功_手把手教你:Windows系统上安装GPU深度学习环境

    前言 在入手学习深度学习的过程当中,有好几个朋友都咨询过我如何安装深度学习环境,之前写过一篇在Ubuntu环境下安装深度学习环境,但是有部分朋友在Windows电脑上安装深度学习环境遇到过许多的问题, ...

  7. 面向初学者的3D游戏着色器————屏幕空间环境遮挡(SSAO)

    屏幕空间环境遮挡(SSAO) SSAO是那些你从来不知道你需要的效果之一,一旦你拥有了它,你就不能没有它.它可以把一个场景从平庸变成哇!对于相当静态的场景,可以将环境遮挡烘焙成纹理,但是对于更动态的场 ...

  8. 现代c++:MacOS VSCode配置c++17环境

    时代在发展,本科的时候学的c++已经不是现在的c++了,于是重新学习c++17.今天第一次用VSCode运行c++ 17,发现需要配置一下编译器才能运行. 现代c++:MacOS VSCode配置c+ ...

  9. 手把手教你搭建属于自己的GPU深度学习环境

    目录 1. Anaconda的简介.安装及配置 1.1 Anaconda简介 1.2 Anaconda安装 1.2.1 安装包的下载 1.2.2 软件安装 1.2.3 补充:Anaconda新建环境默 ...

最新文章

  1. IOS_多线程_ASI_AFN_UIWebView
  2. 【数理知识】特征值、特征向量、左特征向量
  3. 查看git安装目录_一、Linux和Windows下安装Git
  4. 第三章 JVM内存回收区域+对象存活的判断+引用类型+垃圾回收线程
  5. 服装色差的识别成因与预防
  6. 非标自动化企业前十名_自动化输送+旋盖,竟如此简单!机械设计教程精选!...
  7. Lesson5 一阶自治微分方程
  8. cocos2d-x 3.0 使用Sax解析xml文档(解决中文显示问题)
  9. Beego项目打包部署到Linux服务器
  10. 魔百和CM311-1A_YST、(YM)_安卓9_S905L3A_默认开启ADB_纯净精简语音_完美线刷包
  11. XCTF 攻防世界Web题目 mfw
  12. Hololens2开发-3-打包编译安装Hololens应用
  13. c++ 圆上任意点坐标计算_已知圆上任意三点坐标如何编程来计算这个圆的圆心和半径...
  14. NDN Link :利用区块链技术代替TCP/IP 通信模式
  15. 强大的社工之-重庆黑客联盟
  16. 关于skeaz128.h芯片包总头文件V1.3版本与V1.2版本的变更说明
  17. 前端简介--HTML与CSS
  18. 8051单片机的片外总线结构
  19. tf.keras.layers.MaxPooling2D
  20. HockeyKit框架介绍

热门文章

  1. java tomcat原理图,浅谈tomcat工作原理
  2. 深度学习之迁移学习实现神奇宝贝识别
  3. tensorflow2.0中的Broadcasting用法
  4. Lost Cows POJ - 2182(线段树)
  5. php sql注入判断,php防止sql注入漏洞过滤函数的代码
  6. 【编译原理】文法分类
  7. python正则表达式快速入门_Python学习笔记——正则表达式入门
  8. 体感俄罗斯方块,CPU就能跑,全开源
  9. 自动化机器学习(AutoML)之自动贝叶斯调参
  10. 一维OTSU法、最小交叉熵法、二维OTSU法及C++源码