# 深入管线
RenderGraph是小游戏框架提供给开发者的推荐定制管线的机制,未来的发展方向也是如此,届时其将成为一个完善的资源,并会不断进行优化。
但开发者可能仍然想了解一些更加底层的机制,并且进行更加深度的定制,小游戏框架也提供了这样的接口,实际上在自定义节点的时候也可能会用到这些更加深入的内容。
# 一点思考
在正文之前,我们可以思考一个问题——渲染管线是什么。这个在不同的层级有不同的答案,对于应用层而言,其关心的是如何将图形资源管理起来,然后去筛选和绘制,所以一个最简单的渲染管线的抽象为:
一帧开始 -> 设置渲染目标 -> 清屏 -> 准备渲染列表 -> 使用列表渲染 -> 一帧结束
当然,在一帧开始和一帧结束中的内容都是可以有很大伸缩性,但这理论上只要有这些基础的功能,就可以构建出任意复杂度的渲染流程。
小游戏框架便通过几种接口提供了这些能力,这也是构成RenderGraph的根基。
# renderEnv
一部分方法在renderEnv
上:
- beginFrame:开始一帧。
- endFrame:结束一帧。
- setRenderTarget:设置当前即将绘制的渲染目标。
- clearView:使用某个View清除当前正在使用的渲染目标。
# Camera
另一部分方法在camera
之上,其提供了:
- cull:使用相机对当前场景进行剔除。
- clear:直接使用相机的View对当前场景进行清屏,等同于
renderEnv.clearView
操作。 - draw:使用相机绘制一批物体到当前渲染目标上。
- 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();