Skip to content

渲染管线

使用 regPipeline 函数,可以帮助我们快速创建一个即时渲染管线,以便产生更好的演出效果。

// 注册场景、相机、渲染目标
export const stage = regScene("main");
export const view = regCamera("main", c => {});
export const screen = regRT("screen", r => {});
regPipeline("main", p => {
p.add({
scene: stage,
camera: view,
output: screen,
});
});

regPipeline 接受两个参数:

regPipeline(
"main", // 第一个参数
p => {} // 第二个参数
);
  • main 是管线的名称,可以任意指定(但不能与其他管线重名)。
  • 第二个参数则是管线的配置函数,可以在这里对管线进行配置。
    我们只需要修改 p => { ... } 内部的内容;这里的 p 是一个构建器,可以任意指定其名称。

regPipeline 的第二个参数是一个管线构建函数。引擎会将一个构建器实例(通常命名为 p)传递给该函数,用于定义每一帧的渲染流程。

p.add() 接受一个渲染步骤对象作为参数。

p => {
p.add({
scene: stage,
camera: view,
output: screen,
});
};

这个渲染步骤的具体含义是,使用 view 相机拍摄 stage 场景,将渲染结果输出到 screen

  • scene, camera, output 分别接受一个对应的句柄(场景、相机、渲染目标)。
  • 通过调用这个方法,你可以向管线中注册一个渲染通道。每个通道代表一组完整的绘制操作。

多通道

管线支持添加多个步骤,将按照 添加顺序 依次执行,以实现复杂的渲染效果。

p => {
p.add({ /* ... */ });
p.add({ /* ... */ });
};

viewport 定义视口变换的区域。

  • 简单来说,它决定了渲染内容会被“压缩”或“拉伸”到哪个矩形框内。
  • Vector4: (x, y, width, height),默认为 [0, 0, 1920, 1080]

scissor 定义裁剪矩形的范围。

  • 只有位于该矩形区域内的像素才会被更新,区域外的像素会被丢弃(保持原样)。
  • Vector4: (x, y, width, height),默认为 [0, 0, 1920, 1080]

scissorTest 裁剪测试的开关。

  • 只有设为 true 时,scissor 属性才会生效;否则渲染将覆盖整个 Viewport
  • boolean,默认为 false
p => {
p.add({
/* ... */
viewport: [0, 0, 1920, 1080],
scissor: [0, 0, 1920, 1080],
scissorTest: false,
});
};

这些参数决定了在绘制当前步骤之前,是否需要“擦除”上一帧留下的内容。这对于多层渲染(例如:在渲染结果上叠加 2D UI)至关重要。

clear 是否在渲染前清除缓冲区。

  • 如果为 false,则不会清除缓冲区,会保留上一帧的内容,直接在上面绘制。
  • boolean,默认为 true

clearColor 清除后的背景颜色。

  • 仅当 clear: true 时生效。支持十六进制颜色字符串。
  • string, 默认为 "#000000"

clearAlpha 清除后的背景透明度 (0-1)。

  • 仅当 clear: true 时生效。
  • number,默认为 1
p => {
p.add({
/* ... */
clear: true,
clearColor: "#000000",
clearAlpha: 1,
});
};

@TODO

@TODO

@TODO