环境中主要包括地形、大气和植被三部分

地形(Terrain)

地形的几何

HeightField

  • 最简单的地形表达逻辑类似分形以及高度图,我们可以通过一张灰色的高度图来记录对应地形位置的高度;
  • 仍然有良好的效果,广泛被应用。
  • 在引擎中我们设计一个网格mesh,把贴图中的采样点进行采样记录高度位置,将其分布进去。‘ HeightField的实现逻辑

LOD做法

如果是开放世界大小的逻辑时,我们需要做lod以适应特别大的地形以保证远处mesh的开销不会过大,也就是在远处进行mesh采样的时候自动选择不同网格的细节精度; 常见的lod逻辑是对网格进行不断的细分和三角网格化,且实际上我们只需要提高渲染精度的部分是FOV(视锥体)内部的精度足够即可。因此,我们基于FOV的角度进行精度的优化且通过动态拓扑的方法保证相隔对应像素的三角形精度相似,不会有特别剧烈的抖动; 基于FOV的Adaptive 值得注意的是,在这个逻辑中,fovy越小,对应部分需要高精度细分的mesh的最大距离越远。可以简单理解为,为了得到好的显示表示,每个像素点需要包括的三角形数需要接近一致多,那么当fovy越小时,渲染的平面就越小,而拉伸到屏幕大小固定,因此曲面的细分更为精细,见下图简单手绘:

AO(Ambient Occlusion,环境光遮蔽)概述

用于加深表现在光线渲染的时候的暗部表现,来模拟物理正确的阴影情况,具体的渲染方程如下,从形式上来看,其比较接近我们在PBR光照时的BRDF方程。 摘录自GAMES104:AO的公式化表达

  • 在早期以及NPR Shading中,AO烘焙是一种比较常见的解决方法,也就是将面部等位置的环境光遮蔽预计算后加入到人眼的贡献计算,我们称之为PrecomputedAO。(在离线计算,在Realtime时直接采样解决。)
  • 烘焙的AO至今也经常被用于人物的Facet Shading部分,作为AO贴图加入计算。

一些AO方案

SSAO (Screen Space Ambient Occlusion)屏幕空间环境光遮蔽

SSAO是一种简洁,且很经典的AO算法,算法原理见下: 这种算法的逻辑是基于屏幕空间的,简要阐述为:

  • 我们向屏幕上某个表面点p位置,以p为中心绘制球体,在球体内随机撒点N个坐标点。 从相机投射过来一条线,由于我们的物体表面记录时记录的Z-Depth,我们考虑撒入的点的深度与其比较,很显然地可以明确这一点被是否被遮挡。
  • 我们把被遮挡的粒子记作Occlusion(N个例子,每个权重为1),用图中公式A(p)可以得到这一点的遮挡程度。

Weakness

  • 光线照射到上半球的部分,采样的域不是很合理,有一半的粒子是浪费的,只需要采样半球面;而且倘若保持球域撒点,整体环境不可避免地会变暗。

Progressing

基于这个问题,有一种技术称之为SSAO+,将采样领域通过点法线修改为半球采样,缓解了这个问题。 SSAO vs SSAO+ 这种效果当然也有问题,比如没有对Z值的差异进行考虑,可能会出现屏幕上角色挥剑刃的阴影由相机投射在远处建筑物上,导致建筑物上出现莫名黑影。(没找到太好图片,手绘灵魂example) 近处的宝剑投影在建筑上产生错误的巨大阴影

HBAO (Horizon-Based Ambient Occlusion)半球形空间环境光遮蔽

这种算法从待判定点出发,用以SSAO相同的逻辑:首先以点处切平面与法线方向确定半球,以角度为基准遍历0-360°角处,每一个对应的角度上记录的最小仰角.这样在计算光线位置的时候,如果入射管线角度小于最小仰角,我们将这条光线的着色贡献剔除。

HBAO算法概览——来自Games104

  • 值得关注的是,我们可以发现在系数中话存在W项来解决之前的问题——距离远的Occlusion仍然存在影响。 通过计算这个仰角对应的遮挡点距离待计算点p的距离,将遮挡效果从遮挡/不遮挡的0/1关系变为max(0,1-r/R)的约束,那么当遮挡点远于我们预设的采样半径时候会自动变为不遮挡,而在距离内时,会根据距离反比例衰减光强。
  • 在具体计算遮挡点时,我们采用的是RayMarching方式前进,每一步后加入jitter防止走样。

这一贡献成功提升了AO的柔和度,而且能有效解决遮挡问题。

Weakness

虽然我们计算时考虑了阴影的衰减和遮挡距离问题,但是我们回顾最基本的Blin-Phong模型——在光发射过来时,我们的光线贡献是不均匀的,一般地遵循越接近垂直入射,贡献越大的思路!也就是说阴影反过来也是一样,低角度处的遮挡能力会大于垂直方向!(入射贡献低反过来就是阴影的casting更加强大)。

RTX(RayTracing Ambient Occusion)基于光线追踪的环境光遮蔽

当GPU的算力到了足够实时算足够step的raytracing时,所有的其它复杂工作都可以先放在一边了——沃·茨基硕德

比较前沿的一个部分,在这里不做过多赘述,核心就是通过光线追踪直接完成对环境阴影的计算,大力出奇迹。

GTAO(Ground-Truth Ambient Occusion)拟真的环境光遮蔽

概述

终于进入整体。在引入了对光线角度贡献的情况下,我们正式由HBAO走进GTAO效果。 我们在进行渲染时,实际上用于对照的base是离线的蒙特卡洛RayTracing效果,这个方法在显示的时候达到了近乎完全一致的光线效果。 很自信的命名:真值环境光遮蔽

  • 比较有意思的一点是,这个工作中发现:如果我们能计算出AO的效果多少,我们也可以通过相同的逻辑,推测出光线在内部反射后产生的亮度是多少
  • 在原工作中,作者通过大量的数据处理和观察,给出了一个多级展开式,可以通过该点前面计算出来的AO值,拟合处光线在表面多次反射后的亮度结果,曲线如下图: 来自Games104:一个神秘的多项式