跳到主要内容

帧图

GPU 渲染到渲染目标(一张或一组纹理),或最终显示在屏幕上的后备缓冲区。从开始到结束向其中一个目标渲染的过程称为物理渲染通道。一帧需要多个物理渲染通道,帧图将产生这些物理通道的各步骤描述为逻辑通道。本页解释这些概念,本节其他页面介绍 PlayCanvas 的实现。

物理渲染通道​

渲染目标包含一个或多个颜色缓冲区,以及可选的深度和模板缓冲区,统称为附件。后备缓冲区具有相同类型的附件,由画布提供。物理渲染通道分三步向附件渲染:

  1. 开始:将附件清除为指定值,或加载已有内容。
  2. 绘制:所有绘制调用都渲染到附件。
  3. 结束:存储绘制到附件中的内容,或丢弃内容。

图形 API 定义了物理渲染通道:WebGPU 称其为渲染通道,WebGL 中则对应向一个帧缓冲区进行的绘制。

物理计算通道​

计算着色器不向渲染目标渲染,而是运行派发任务,直接读写缓冲区和纹理。GPU 在物理计算通道中执行这些任务,其组织派发任务的方式类似物理渲染通道组织绘制调用。计算着色器仅受 WebGPU 支持。

一帧中的通道​

帧是应用渲染的一幅图像,通常对应显示器的一次刷新。物理渲染通道只渲染到单个目标,因此一帧需要多个通道:要切换目标,例如采样刚刚渲染好的纹理时,必须结束一个物理通道,再开始另一个。一个简单帧包含三个物理渲染通道,后一个都采样前一个的渲染结果:

每个方框代表一个物理渲染通道,以输出目标命名:灯光阴影贴图、保存场景的纹理,以及后处理将场景纹理绘制到的后备缓冲区。通道相互依赖,因此顺序至关重要:采样纹理的通道必须在向该纹理渲染的通道之后执行。

帧图​

帧图按执行顺序描述一帧的所有步骤,包括各步骤渲染到哪里,以及绘制或计算什么。每一步就是一个逻辑通道。渲染器先构建整帧的帧图,再在物理通道中执行逻辑通道,而不是边执行边决定物理通道的开始和结束。多数逻辑渲染通道拥有独立的物理通道,但预先了解整帧后,渲染器只需开始和结束真正需要的物理通道:

  • **逻辑通道共享物理渲染通道。**连续渲染到同一目标的逻辑通道会记录到同一物理通道,避免在它们之间反复存储和加载附件。
  • **仅在需要时存储附件。**后续逻辑通道需要加载的附件会被存储,其他附件则可以丢弃。

这里,三个逻辑通道通过两个物理渲染通道完成一帧:

多相机​

场景可以有多台相机,例如一台向纹理渲染反射或迷你地图,主相机向屏幕渲染。帧图按优先级将所有相机的逻辑通道组合为一帧:优先级数值较小的相机先执行。因此,向纹理渲染的相机需要比使用该纹理的相机具有更小的优先级,确保纹理在使用时就绪。相机所需的阴影贴图在其场景之前渲染。

性能​

开始和结束物理渲染通道有开销,在移动 GPU 上尤其明显。这类 GPU 在快速片上内存的小分块中渲染,并在片上与主内存之间复制附件:加载时读入,存储时写出。因此,一帧的物理通道数量及其加载、存储内容都会影响性能。清除附件而非加载可避免读入已有内容;渲染到同一目标的逻辑通道共享物理通道也能减少复制。

PlayCanvas 中的实现​

帧图中的每个逻辑通道都是引擎对象,即帧通道。引擎自身用帧通道渲染,也允许添加自定义通道:

  • 帧通道:帧图的逻辑通道,介绍通道类及其生命周期。
  • 相机通道:在相机之前和之后渲染,或替换相机渲染。
  • 渲染通道:渲染到目标,包括对每个像素运行着色器,以及渲染场景。
  • 计算通道:运行计算着色器。