孤岛危机系列/CRYENGINE渲染技术简介


百度孤岛危机吧
  • 本文目的为扫盲,不面向专业人士
  • 欢迎提交Pull Request参与撰写

目录

  • 孤岛危机1/弹头
  • 孤岛危机2
  • 孤岛危机3
  • Ryse/EaaS时代
  • CRYENGINE V

孤岛危机1

CryEngine 2

Shader系统

  • Uber-shader
  • 预先生成不同程序变体,减少动态分支
  • 最小化状态切换
  • 减少不必要的寄存器占用

ZPass

  • 预先渲染场景深度图
  • 减少pixel shader中不必要的渲染
  • 基于屏幕空间信息的渲染技术
    • SSAO,大气散射,后处理体积光……
    • 对之后的游戏画面技术影响深远

阴影

  • Cascaded Shadow Map
  • 渲染多张shadow map覆盖长距离阴影
  • 地形投影使用VSM

Deferred Shadow Mask

  • 将阴影输出至屏幕空间遮罩
  • R通道存储平行光,GBA存储点光源
  • 可在屏幕空间处理软阴影
  • 优化渲染管线

地形AO

  • 预烘培植被、地形与静态物体(brush)的AO
  • 保存进体纹理
  • 渲染时采样体纹理,输出至RT
  • 大幅度加强丛林光照的层次感

地形AO

SSAO

SSAO

  • 基本思想:使用屏幕空间深度信息计算AO
  • 广泛应用于之后的游戏中

植被

  • 漫反射,高光,表面下散射,透射
  • 投射、散射效果基于视角变化
  • 可调真阴影与光照部分的混合比例,给予植被更强的体积感
  • 支持预渲染SH光照系数
  • 相比现代PBR,孤岛危机1没有使用复杂的光照模型,但给予美术人员更大的控制权

植被程序动画

  • 分两部分:结构上的摆动;细节摆动
  • 结构摆动:根据场景中的风力源以及植被高度,作逐顶点风力模拟
  • 细节摆动:使用四个三角波的组合模拟风力,对模型进行形变
  • 模型形变由美术人员预先绘制

植被优化

  • 批次渲染
  • 对于较远的植被(200~300m外),替换成图片(billborad)
  • 生成Billboard时会预计算光照,使得远距离的植被也有很好的体积感

物体动态模糊

  • 输出物体的速度方向与大小
  • 对于运动物体沿运动方向扩展边缘(velocity dilation)
  • 沿运动方向累积采样
  • 生成MB Mask,只对运动物体进行混合
(编写中……)

孤岛危机2

CryEngine 3.3/3.4

延迟渲染

  • Deferred Lighting/Light Pre-pass
    • 先渲染一遍场景,输出一些基本的场景材质信息到GBuffer
    • 在一个灯光缓冲(Light buffer)中累积光照
    • 再渲染一遍场景,结合之前累积的光照信息以及材质信息得到最终渲染结果
  • 优点:减少GBuffer的大小,降低带宽。
    • 适合X360/PS3等硬件
  • 缺点:需要渲染场景两遍

Light Propagation Volume

  • I3D 2010论文
  • 第一个用于正式游戏项目的动态全局光照算法

Light Propagation Volume

  • 基本思想:VPL,instant radiosity等方法的结合
    • 渲染RSM
    • 将得到的结果作为虚拟光源注入体纹理,以二阶SH系数表示
    • 在体纹理中沿6个方向传播
    • 将场景可见信息存入另一张体纹理,用于间接光照的投影

LPV技术的扩展

多次反弹

受GI影响的粒子

高光反射

  • 沿反射方向ray march体纹理数据累积光照
  • 体渲染

    屏幕空间反射

    屏幕空间反射

    • 首次出现在孤岛危机2中,广泛用于今天的游戏
    • GBuffer提供了屏幕空间的场景信息,可以直接对其进行ray march算出光照
    • 优点:速度快,可以得到符合基于物理BRDF的高光形状
      • 见寒霜3的Stochastic SSR
      • 孤岛危机2、3中只是简单地叠加到最终渲染结果中
    • 缺点:无法获得屏幕空间外的反射信息
      • Fall back to IBL
    (编写中……)

    孤岛危机3

    CryEngine 3.5

    大规模草丛

    Automerged Grass

    大规模草丛

    • 分区块管理草丛,剔除不必要的模型实例,计算lod
    • 使用16*16*16保存风力扰动
    • 使用transient buffer等方法实现高效的内存管理与任务分派

    间接照明

    • 孤岛危机3的场景照明大多为静态
    • PC:LPV+手动打光
    • LPV精度低,由手动打光弥补

    间接照明-GIF

    (编写中……)

    Ryse

    CRYENGINE 3.6

    Tiled Deferred Shading

    • 将屏幕划分成多个区块(tile)用以提出光源,每个区块保存影响该范围的光源列表
    • GBuffer与渲染结果只读取和写入一次,大幅度减少带宽压力
    • 减少不必要的光源重绘

    Forward+

    • 将tiled deferred的思想用于前向渲染上
    • 读取TBDR产生的光源列表
    • 利用depth pre-pass避免不必要的重绘
    • 用于复杂材质,如毛发,眼睛等

    基于物理的渲染

      高光:Cook Torrance模型
    • 菲涅尔项:Schlick近似
    • 法线分布项:GGX
    • 几何遮挡项:Schilck-Smith
      漫反射:Oren-Nayer模型

    基于物理的渲染

      Image Based Lighting
      • Split-sum approximation(虚幻4,COD:BO2)
      • 将渲染方程拆分成两部分,预计算DFG项,存入一张2D LUT纹理中
      • 可改善不同粗糙度和视角下环境贴图的菲涅尔反射

    LOD

    • LOD级别根据模型在屏幕上的三角形平均覆盖率选择
    • 减少不必要的多边形数,减少aliasing
    (编写中……)

    EaaS时期

    CRYENGINE 3.6~3.8

    SVOGI

    SVOGI

    • CRYENGINE的SVOGI是一个半实时的实现
    • CPU端建立SVO,在运行时实时streaming到GPU上,不在GPU上更新SVO
    • 通过在渲染RSM时注入动态物体的颜色近似实现动态间接照明

    SVOGI (GIF)

    体积光

    体积光

    • 方法类似寒霜3
    • 构建视锥体形状的体素,保存大气参数
    • ray march体纹理,采样shadow map累积光照

    CRYENGINE V

    渲染管线2.0

    (编写中……)

    体积云

    • 采用了《地平线:黎明时分》的方法
    • 基本思想
      • 通过ray march Perlin和Worley等噪声模拟低空积雨云的形状
      • 在累积光照时使用更加复杂的光照模型,如Powder效果,多重散射

    GPU粒子

    (编写中……)