GPU Gems1 - 17 环境遮挡

环境光遮蔽(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)

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/246295.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

GPU Gems1 - 18 空间BRDF(Spatial BRDFs)

这章主要介绍了空间双向反射分布函数&#xff08;SBRDF&#xff09;&#xff0c;接着文章讨论了压缩SBRDF表达式&#xff0c;以及由离散光或环境贴图所照明的SBRDF的渲染方法。关于BRDF请参考大佬浅墨的这篇文章https://blog.csdn.net/poem_qianmo/article/details/75943714 S…

浅谈表面反射——波动光学篇

Radiometric Definitions 首先让我们来回忆一下辐射度量学中关于irradiance和radiance的定义&#xff1a; 我们在这里定义光源(source)在x-z平面&#xff0c;因此入射光就可以只用θi\theta_{i}θi​来描述。dAs\mathrm{d}A_{s}dAs​是表面积。定义dΦi\mathrm{d}\Phi_{i}dΦ…

GPU Gems1 - 19 基于图像的光照(Image-Based Lighting)

这篇文章打破了当时立方体贴图环境&#xff08;Cube-Map Environment&#xff09;用法的桎梏&#xff0c;深入研究了更多可能的逼真光照效果。文章主要研究了基于图像的光照&#xff08;Image-Based Lighting&#xff0c;IBL&#xff09;&#xff0c;包括局部化的立方体映射&am…

Polygonal-Light Shading with LTC

概述 如果我们有一个上半球的余弦分布函数(Do)(D_{o})(Do​)&#xff0c;并对这个余弦分布函数进行一个矩阵(M)(M)(M)变换&#xff0c;变换为一个新的分布函数(D)(D)(D)。 DMDoD M D_{o}DMDo​ 这就是基本思想&#xff1a;用一个余弦分布函数来拟合出不同的分布函数&#xff…

GPU Gems1 - 20 纹理爆炸(Texture Bombing)

【章节概览】 这章介绍了纹理爆炸&#xff08;Texture Bombing&#xff09;和相关的细胞技术&#xff0c;它们能在Shader中增加视觉的丰富性&#xff0c;图像的多样性&#xff0c;并减少大块纹理图案的重复性。 【核心要点】 纹理爆炸&#xff08;Texture bombing&#xff0…

Catlike Coding网站文章解析 -- 1.Procedural Grid

原文英文版链接https://catlikecoding.com/unity/tutorials/procedural-grid/&#xff0c;里面有每一部分的untiy工程链接&#xff0c;文章内容也更详实。 本章内容&#xff1a; 创建一系列点使用协程实现他们的摆放位置定义一个由三角形组成的平面自动生成法线添加纹理坐标和…

GPU Gems1 - 21 实时辉光(Real-Time Glow)

这章浅墨的文章讲的很细了&#xff0c;这里基本照扒一遍加深印象&#xff0c;原文链接&#xff1a;https://zhuanlan.zhihu.com/p/36499291 【章节概览】 这章讲到2D光照效果中的辉光&#xff08;Glow&#xff09;和光晕&#xff08;Halo&#xff09;&#xff0c;展示了如何通…

Catlike Coding网站文章解析 -- 2.Procedural Grid

本章内容 创建一个闭合的cube mesh给cube添加带弧度平滑的边缘定义法线使用sub-meshes&#xff08;子mesh&#xff09;创建一个常规shader合并碰撞体1.合成一个cube 上一章https://mp.csdn.net/postedit/89474068我们已经实现了一个平面mesh。一个cube由6个平面组成&#xff…

GPU Gems1 - 23 景深技术综述

本章主要介绍如何使用GPU创建实时的景深&#xff08;Depth of Field&#xff09;效果。参考浅墨总结文章的链接https://zhuanlan.zhihu.com/p/36499291 聚焦在枪上&#xff0c;背景模糊【核心要点】 物体在距离镜头的一个范围之内能够清晰成像&#xff08;经过聚焦&#xff09…

GPU Gems1 - 22 颜色控制(Color Controls)

这章将在游戏中图像处理的讨论&#xff0c;扩展到技术和艺术上控制颜色的方法和应用&#xff0c;包括将图像从一些的色彩空间中移入移出&#xff0c;以及快速地给任何2D或3D场景加上精美的色调。 色彩校正&#xff08;Color Correction&#xff09;是几乎所有印刷和胶片成像应…

GPU Gems1 - 25 用纹理贴图进行快速过滤宽度的计算

这章介绍在片元shader中计算导数近似值的技术。这个技术把特别的值载入纹理mipmap的每个级别&#xff0c;以特殊的方式使用纹理映射硬件&#xff0c;计算出导数的结果&#xff0c;给出在屏幕上的像素间某个量的变化率。 Cg标准程序库提供ddx和ddy函数&#xff0c;计算任意关于…

GPU Gems1 - 24 高质量的过滤

在一些应用中&#xff0c;高质量的过滤是至关重要的&#xff0c;可以用像素shader代码执行任何过滤。GPU着色程序不用于CPU的主要之处在于&#xff1a;一般来说&#xff0c;CPU数学操作比纹理访问更快&#xff0c;而在GPU中恰恰相反。图像过滤的目的很简单&#xff1a;对于给你…

GPU Gems1 - 26 OpenEXR图像文件格式与HDR(The OpenEXR Image File Format and HDR)

【章节概览】 这章中&#xff0c;大名鼎鼎的工业光魔公司的Florian Kainz、Rod Bogart和DrweHess介绍了OpenEXR标准&#xff0c;这是一种当时新的高动态范围图像&#xff08;HDRI&#xff09;格式&#xff0c;在计算机成像的顶级电影中正在快速推广。对于基于图像照明的开发者…

ID Tech 5 中Megatexture针对地形的D3D9 基本实现原理

看GPU Gems2中的 使用基于GPU几何体裁剪图的地形渲染&#xff08;Terrain Rendering Using GPU-Based Geometry Clipmaps&#xff09;一文&#xff0c;对Clipmap技术不是理解很好&#xff0c;所以上网搜索一番&#xff0c;发现了这篇文章&#xff0c;实在是太棒的文章&#xff…

[知乎] 开放世界游戏中的大地图背后有哪些实现技术?

今天看到的一篇关于大世界的技术文章&#xff0c;写的太好了&#xff0c;膜拜大佬。各位如果有时间一定要看看 原文&#xff1a;http://gulu-dev.com/post/2014-11-16-open-world#toc_10 一、程序技术篇&#xff1a;算法和架构&#xff08;Programming Algorithms & Arch…

GPU Gems2 - 2 使用基于GPU几何体裁剪图的地形渲染(Terrain Rendering Using GPU-Based Geometry Clipmaps)

【章节概览】 本章描述了一种通过顶点纹理实现的&#xff0c;基于GPU的几何体裁剪图&#xff08;Geometry Clipmaps&#xff09;技术。通过把地形几何体当做一组图像来处理&#xff0c;可以在GPU上执行几乎所有的计算&#xff0c;因此可以减少CPU的负载。且该技术较为容易实现…

球谐光照

一.原理 球谐光照实际上是一种对光照的简化&#xff0c;对于空间上的一点&#xff0c;受到的光照在各个方向上是不同的&#xff0c;也即各向异性&#xff0c;所以空间上一点如果要完全还原光照情况&#xff0c;那就需要记录周围球面上所有方向的光照。注意这里考虑的周围环境往…

图像色调,饱和度,对比度等相关定义

RGB颜色模型 RGB颜色模型也就是我们最常用的三原色&#xff0c;红绿蓝。RGB颜色模型在混色时属于加法混色&#xff0c;RGB中每种颜色数值越高&#xff0c;色彩越明亮。RBG为&#xff08;0,0,0&#xff09;时为黑色&#xff0c;RGB为&#xff08;255,255,255&#xff09;时为白…

各Rendering Path技术以及其在Unity中的实现

Rendering Path其实指的就是渲染场景中光照的方式。由于场景中的光源可能很多&#xff0c;甚至是动态的光源。所以怎么在速度和效果上达到一个最好的结果确实很困难。以当今的显卡发展为契机&#xff0c;人们才衍生出了这么多的Rendering Path来处理各种光照。 一. 正向渲染Fo…

GPU Gems2 - 3 几何体实例化的内幕(Inside Geometry Instancing)

文章部分内容摘自 https://zhuanlan.zhihu.com/p/38411575 【章节概览】 本章讨论了在Direct3D中渲染一个几何体的许多独特实例&#xff08;Instance&#xff09;的技术细节问题&#xff0c;对几何体实例&#xff08;Geometry Instancing&#xff09;的技术内幕进行了分析。 【…