渲染场景
RenderPassForward 是使用单台相机渲染场景图层的 RenderPass,也是引擎自身渲染场景所用的通道。将它放入相机的 framePasses,可将场景渲染到自定义目标,并在显示前通过自己的通道处理。
创建通道
使用图形设备、场景以及负责渲染图层的相机组件创建通道。用目标渲染目标初始化,再按顺序添加要渲染的图层:
const worldLayer = app.scene.layers.getLayerByName('World');
const uiLayer = app.scene.layers.getLayerById(LAYERID_UI);
const scenePass = new RenderPassForward(app.graphicsDevice, app.scene, cameraEntity.camera);
scenePass.name = 'ScenePass';
scenePass.init(renderTarget);
scenePass.addLayer(worldLayer, false);
scenePass.addLayer(uiLayer, true);
每个图层包含不透明和透明两个子图层。addLayer 的第二个参数选择渲染哪一个,因此要同时渲染两者,需要添加图层两次。相机本身也必须包含这些图层,参见 CameraComponent#layers。
通道每帧执行什么
通道按相机的方式渲染图层:
- 根据相机和图层的清除标志清除渲染目标。将
addLayer第三个参数设为false,可不为该图层清除。 - 根据相机剔除图层的网格实例,并渲染它们所需的平行光阴影。
- 如果它是本帧首个渲染该相机的通道,则执行相机的
beforePasses。 - 本帧首个渲染该相机的通道触发场景
prerender事件,最后一个触发postrender,每个图层渲染前后分别触发prerender:layer和postrender:layer。
伽马校正和色调映射
默认使用相机的伽马校正和色调映射。通道可通过 gammaCorrection 和 toneMapping 覆盖。例如 HDR 管线先将场景线性渲染到浮点目标,后续通道再进行色调映射,而向屏幕绘制 UI 的通道保留相机设置:
scenePass.gammaCorrection = GAMMA_NONE;
scenePass.toneMapping = TONEMAP_LINEAR;
替换相机渲染
要用自定义通道渲染相机,将 RenderPassForward 及处理其输出的通道添加到 framePasses。例如先向纹理渲染场景,再用着色器四边形通道将纹理绘制到屏幕。相机也可用多个前向通道渲染:先不透明图层,再用自定义通道读取结果,最后透明图层。参见相机通道。
限制
RenderPassForward 不能嵌套在另一个同类通道之下:既不能放入其前置或后置通道,也不能放入其相机的 beforePasses(它会先执行这些通道)。要先用另一相机渲染图层,应依次执行通道,例如将它们放入 framePasses 中一个普通 FramePass 的前置列表,或使用更低优先级的相机渲染。
示例
前向通道将世界和 UI 图层渲染到纹理,再由着色器四边形通道着色后绘制到屏幕。
相机渲染通道