Real Shading in Unreal Engine 4

图片1UE4的PBR使用 Directional light BRDF + Imaga-based lighting

BRDF: Diffuse BRDF + Specular BRDF

Diffuse BRDF: 

使用了Lambert,因为在diffuse项上更复杂的模型和Lambert区别很小

QQ截图20170812140824

Specular BRDF

使用的是通用的macrofacet model,关键在与每一项的选择上

QQ截图20170812141439

D(h) : Specular distribution用了GGX(Trowbridge-Reitz), GGX的优势:Fairly cheap + Longer tail(look more natural)

QQ截图20170812141927.png

G(l, v, h):Geometric shadowing,用了Schlick, Schlick优势:Matched to Smith, Cheaper but difference is minor, 需要注意的是这里roughness用了Disney’s roughness remapping, 

这里简单介绍一下roughness remapping,

QQ截图20170812143848

reamapping可以在感知上在roughness上有更线性的变化,没有remapping那么在调节shiny材质时需要额外的参数调整QQ截图20170812144219

Fresnel:Schlick

Image-base lighting:

需要克服的问题:每个environment map只采样一次,但是要匹配importance-sampled的结果,公式表示如下:

QQ截图20170812144635

UE4采用的解决方案:split the sum, 然后预计算分开的每个部分,split如下,

QQ截图20170812144836.png

第一部分存储在pre-filtered environment map中,

QQ截图20170812145026.png

第二部分存储在2D的LUT中

QQ截图20170812145132.png

结果对比图如下:

QQ截图20170812145243.png

另外UE4的Material model中使用了BaseColor + Metallic + Roughness + Cavity,并没有使用Specular信息(后来UE4中实际提供了一个specular paramters)。其中Cavity相当于非常小范围trace的AO,用来表示real-time shadow不能表示的小shadow。

Birian karis在https://www.unrealengine.com/en-US/blog/physically-based-shading-on-mobile 分享了UE4的pbr在mobile上的优化。

[GDC2017]GHOST RECON WILDLANDS TERRAIN TECHNOLOGY AND TOOLS

2017今年GDC上幽灵行动-荒野团队做了地形技术的分享,先看到视频,做的确实牛逼。

这一代的幽灵行动放弃了历代使用的YETI引擎(x86-DX9),改用了刺客信条使用的ANVIL引擎(x64-DX11)。

幽灵行动-荒野的地形是育碧做过的最大的动作冒险类开放世界游戏,使用了32k*32k的超大heightmap,11种生态群落,140+种材质,16.369km^2的河流湖泊,839863颗树,3449638颗灌木,775288块石头,656.421km的道路等等。做到了超大的地图,以及丰富真实的细节表现。

这种超大地图如果让美术用笔刷一点点去刷,一张图下来美术肯定要刷吐了,所以他们团队做了一个半自动化的地形生成方式,让美术从繁琐的劳动中解放出来,只需要关注需要艺术创作的地方,他们的地形生成主要分成一下四步:

  1. 用真实世界的地形数据在world machine中创建出基础的地形。
  2. 在GPU上实现的超大范围笔刷(最大可以2km*2km),制作大的结构(山体结构等等)。
  3. 在Houdini里产生的地表覆盖物(树木,河流,道路,定居点等等)。
  4. 美术根据艺术创作的调整。

在地形材质生成方面,他们使用了一种特别帅气的过程式生成方式,即根据高度,坡度,噪音,曲率定义n组规则,每组规则代表一种材质,最后根据规则计算的结果得到最佳的地形材质分布,伪代码如下:

float blend = slopeBlend * heightBlend * flowBlend;

bestBlend *= 1.0f – blend;

if (bestBlend <= blend)

{

bestBlend = blend;

bestIndex = stackIndex;

}

在地形渲染方面,他们做了一个非常好的渲染策略,极大的提高了渲染效率。通常在地形渲染过程中,为了避免在坡度非常大的地方出现明显的贴图拉伸,需要在x,y方向上各进行一次采样,这样如果地形有四层材质,就总共需要8次采样。幽灵行动-荒野对地形做了分块处理黄色区域进行4次采样,绿色8次采样,红色12次采样(作为过渡地带要全采样),用这种方法以后,地形中80%的区域只需要进行4次采样。

QQ截图20170416234046

另外这么丰富的地形材质,纹理读取是个不小的消耗,所以幽灵行动-荒野也使用了virtual texture,作为目前最常用的减少纹理读取的技术被很多游戏成功使用。

这么大的地形,地表覆盖物的生成也采用了半自动化的生成方式:

  1. 根据地形的heightmap和splat map,计算得到Roughness map(用来指导放置岩石和植被),根据河流信息生成wetness map(用来指导放置植被,以及影响terrain specular),太阳信息做平均得到sunlight map(向光面比被光面植被密度大),另外还会用world machine生成water flow map(影响terrain splatting)。
  2. 根据1中提到的6张图,自动化生成地表的岩石,道路,植被,村庄等等。

幽灵行动-荒野把超大地图的细节做的这么丰富的同时保持了良好的渲染效率,确实厉害,值得学习。

第一篇博文

最近读的文章越来越多,加上工作过程中经验的积累,越发觉得需要一个可以记录自己和分享自己所学的地方,一方面写出来可以督促自己对知识进行更深入的学习, 另外一方面也可以贯彻程序员世界的分享精神。