# 深入管线

RenderGraph是小游戏框架提供给开发者的推荐定制管线的机制,未来的发展方向也是如此,届时其将成为一个完善的资源,并会不断进行优化。

但开发者可能仍然想了解一些更加底层的机制,并且进行更加深度的定制,小游戏框架也提供了这样的接口,实际上在自定义节点的时候也可能会用到这些更加深入的内容。

# 一点思考

在正文之前,我们可以思考一个问题——渲染管线是什么。这个在不同的层级有不同的答案,对于应用层而言,其关心的是如何将图形资源管理起来,然后去筛选和绘制,所以一个最简单的渲染管线的抽象为:

一帧开始 -> 设置渲染目标 -> 清屏 -> 准备渲染列表 -> 使用列表渲染 -> 一帧结束

当然,在一帧开始一帧结束中的内容都是可以有很大伸缩性,但这理论上只要有这些基础的功能,就可以构建出任意复杂度的渲染流程。

小游戏框架便通过几种接口提供了这些能力,这也是构成 RenderGraph 的根基。

# renderEnv

一部分方法在renderEnv上:

  1. beginFrame:开始一帧。
  2. endFrame:结束一帧。
  3. setRenderTarget:设置当前即将绘制的渲染目标。
  4. clearView:使用某个 View 清除当前正在使用的渲染目标。

# Camera

另一部分方法在camera之上,其提供了:

  1. cull:使用相机对当前场景进行剔除。
  2. clear:直接使用相机的 View 对当前场景进行清屏,等同于renderEnv.clearView操作。
  3. draw:使用相机绘制一批物体到当前渲染目标上。
  4. drawLight:使用相机绘制某个平行光产生的阴影贴图。

# 使用案例

下面是直接使用底层接口实现一个简单管线的实例:

// 创建渲染列表
const renderList = new engine.ScalableList(1024);

// 以下是每帧loop
// 开始一帧
engine.renderEnv.beginFrame();
// 设置渲染目标
engine.renderEnv.setRenderTarget(camera.renderTarget);
// 剔除场景并存入渲染列表
camera.cull(renderList, 'ForwardBase');
// 清空渲染目标
camera.clear();
// 绘制
camera.draw(renderList, 'ForwardBase');
// 结束一帧
engine.renderEnv.endFrame();