跳转到主要内容
Computer Graphics Sep 30, 2022 3 tags

实时渲染基础 上

实时渲染基础 上

cover

前言

介绍

实时渲染在不渲染任何物体的时候能达到其最高性能;

RTR流程的本质是管理性能损耗和画面质量的平衡。

如果画质不提升但是对性能消耗很大,那么这一步就该省略掉

  • 确定目标帧率
  • 专注于方案和工作流达到目标帧率
  • 确保获得尽可能多的回报

实现真实感非常复杂

  • 所有环节都必须要尽可能地高效
  • 需要严格的流程标准和限制(分辨率
  • 将一部分工作分配到预计算环节(空间换时间、烘培

CPU vs GPU

渲染前准备

接下来主要介绍延迟渲染管线,前向渲染可能会带过一点。

线程是同时工作的,在CPU中处理物理、动画等,在第33ms时候CPU处理完成传递给DARWCALL,让其准备一些数据传递给GPU计算,与此同时CPU已经开始第二帧的计算了

CPU 第0帧-0ms-游戏线程

大部分在CPU 第1帧-33ms-渲染线程

遮挡过程(逐物体而不是逐三角形)

建立一个可见物体的列表

  1. 距离剔除——根据物体与相机的距离决定是否剔除(默认未开启)
  2. 视锥剔除——根据物体是否在视锥内决定是否剔除
  3. 预计算可见性——将可见性结果提前计算好并储存下来(空间换时间)
  4. 遮挡剔除——性能消耗最大,在最后执行

遮挡过程性能提示

几何体渲染

GPU-第2帧-66ms

Prepass/Early Z Pass

GPU现在已经知道了需要渲染的物体的列表及其位置信息,但是如果直接渲染,会有一些像素重复绘制,造成非常大的浪费

因此我们需要找出哪些模块应该先被渲染

  • Early Z

DrawCall

Drawcall是指渲染时特定Pass中采用的单一处理过程

通常可以理解为绘制拥有相同属性的一组多边形

切换材质非常影响性能开销

在GPU渲染时,引擎会根据材质对物体进行排序,相同材质的会在同一个批次里绘制

  • Drawcall对性能有非常大的影响

  • 每次GPU绘制完成后,需要从渲染线程拿新的指令,这里会有比较大性能开销

  • Drawcall数量对性能的影响比三角形数量要大许多 小Tips:Drawcall的影响比三角形数量对性能的影响要大得多

  • 通过stat RHI命令查看运行统计数据

  • 2000-3000:合理

  • ≥5000:略高

  • ≥10000也许会有性能问题

  • 移动端在几百左右比较合适

Drawcall相关的性能提示

  • Drawcall数量相比多边形数量对性能的影响更大
  • 引擎有一些Drawcall的基础开销
  • 为了降低Drawcall,我们可以将模型进行合并,但也有副作用
  • 一个较为常用的技术称为Modular Meshes
  • 也可以使用Instancing降低Drawcall
  • Level Of Detail(LOD)和HLOD

Shader

Vertex Shader

顶点着色器性能提示

  • 动画越复杂性能越慢
  • 定点越多性能越慢
  • 高精度的模型最好使用简单的Vertex Shaders
  • 对远距离的物体禁用顶点动画

Nanite

一般来说,能启用时应该尽量启用Nanite。虚幻引擎5中的NaniteMesh渲染经过了高度优化,通常可以更快渲染,占用的内存和磁盘空间也更少。

具体而言,网格体如果满足以下条件,将很适合使用Nanite:

  • 包含很多三角形,或屏幕上三角形非常小
  • 场景中有很多实例
  • 作为其他Nanite几何体的主要遮挡物

Nanite目前还不支持:

  • 骨骼动画(Skeletal animation)
  • 变形目标(Morph Targets)
  • 自定义深度或模板
  • 半透明材质
  • 材质的世界位置偏移(World Position Offset in materials)
  • 针对完整Nanite细节的光线追踪

支持的平台

  • Nvida:Maxwell显卡或更新版本
  • AMD:GCN显卡或更新版本

光栅化和Buffer

提供了变换数据、投影顶点以及必要的着色数据后,下一步时找到了所有在这些三角形内部需要渲染的像素点,这个过程我们称为光栅化

光栅化按照Drawcall的顺序逐次调用

Related Articles

继续阅读