帧图
GPU 渲染到渲染目标(一张或一组纹理),或最终显示在屏幕上的后备缓冲区。从开始到结束向其中一个目标渲染的过程称为物理渲染通道。一帧需要多个物理渲染通道,帧图将产生这些物理通道的各步骤描述为逻辑通道。本页解释这些概念,本节其他页面介绍 PlayCanvas 的实现。
物理渲染通道
渲染目标包含一个或多个颜色缓冲区,以及可选的深度和模板缓冲区,统称为附件。后备缓冲区具有相同类型的附件,由画布提供。物理渲染通道分三步向附件渲染:
- 开始:将附件清除为指定值,或加载已有内容。
- 绘制:所有绘制调用都渲染到附件。
- 结束:存储绘制到附件中的内容,或丢弃内容。
图形 API 定义了物理渲染通道:WebGPU 称其为渲染通道,WebGL 中则对应向一个帧缓冲区进行的绘制。
物理计算通道
计算着色器不向渲染目标渲染,而是运行派发任务,直接读写缓冲区和纹理。GPU 在物理计算通道中执行这些任务,其组织派发任务的方式类似物理渲染通道组织绘制调用。计算着色器仅受 WebGPU 支持。
一帧中的通道
帧是应用渲染的一幅图像,通常对应显示器的一次刷新。物理渲染通道只渲染到单个目标,因此一帧需要多个通道:要切换目标,例如采样刚刚渲染好的纹理时,必须结束一个物理通道,再开始另一个。一个简单帧包含三个物理渲染通道,后一个都采样前一个的渲染结果:
每个方框代表一个物理渲染通道,以输出目标命名:灯光阴影贴图、保存场景的纹理,以及后处理将场景纹理绘制到的后备缓冲区。通道相互依赖,因此顺序至关重要:采样纹理的通道必须在向该纹理渲染的通道之后执行。
帧图
帧图按执行顺序描述一帧的所有步骤,包括各步骤渲染到哪里,以及绘制或计算什么。每一步就是一个逻辑通道。渲染器先构建整帧的帧图,再在物理通道中执行逻辑通道,而不是边执行边决定物理通道的开始和结束。多数逻辑渲染通道拥有独立的物理通道,但预先了解整帧后,渲染器只需开始和结束真正需要的物理通道:
- **逻辑通道共享物理渲染通道。**连续渲染到同一目标的逻辑通道会记录到同一物理通道,避免在它们之间反复存储和加载附件。
- **仅在需要时存储附件。**后续逻辑通道需要加载的附件会被存储,其他附件则可以丢弃。
这里,三个逻辑通道通过两个物理渲染通道完成一帧:
多相机
场景可以有多台相机,例如一台向纹理渲染反射或迷你地图,主相机向屏幕渲染。帧图按优先级将所有相机的逻辑通道组合为一帧:优先级数值较小的相机先执行。因此,向纹理渲染的相机需要比使用该纹理的相机具有更小的优先级,确保纹理在使用时就绪。相机所需的阴影贴图在其场景之前渲染。
性能
开始和结束物理渲染通道有开销,在移动 GPU 上尤其明显。这类 GPU 在快速片上内存的小分块中渲染,并在片上与主内存之间复制附件:加载时读入,存储时写出。因此,一帧的物理通道数量及其加载、存储内容都会影响性能。清除附件而非加载可避免读入已有内容;渲染到同一目标的逻辑通道共享物理通道也能减少复制。
PlayCanvas 中的实现
帧图中的每个逻辑通道都是引擎对象,即帧通道。引擎自身用帧通道渲染,也允许添加自定义通道: