跳到主要内容

渲染场景

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 图层渲染到纹理,再由着色器四边形通道着色后绘制到屏幕。

相机渲染通道