跳到主要内容

图层

图层概览​

图层允许自定义应用的渲染循环,实现高级渲染功能,例如:

  • 修改网格渲染顺序。
  • 让相机只渲染部分网格。
  • 指定哪些灯光影响哪些网格。

PlayCanvas 应用创建时带有始终保留的一组默认图层。可以创建自定义图层,并按需求调整顺序。

本质上,图层是待渲染网格的列表。每个图层分为不透明和透明两个子图层。网格加入时,会根据材质是否需要透明渲染,存入其中一个子图层,因为透明子图层通常采用不同的排序方式。

渲染顺序​

三个因素决定网格的渲染顺序。

相机优先级​

相机优先级是主要因素。每台相机具有一个优先级数值,较小值先渲染。

每台相机还有图层列表,控制渲染哪些图层,顺序见下一节。

相机图层

图层组合​

其次是应用的图层顺序。每个应用包含 pc.LayerComposition 对象,可通过 this.app.scene.layers 访问。图层组合决定所有子图层的顺序。顺序以子图层而非整个图层为单位,因此可以先渲染所有不透明子图层,再渲染所有透明子图层。

注意:将模型放入在 World 之后渲染的图层,不会使它显示在 World 所有内容之上!标准材质的 depthTest 默认为 true,GPU 绘制每个像素前都会检查是否有其他内容位于其前方,即使前方像素来自更早的图层也是如此。若希望渲染网格时忽略与相机的距离,应在材质中禁用 depthTest。

排序模式​

每个子图层具有排序模式,每帧据此对网格排序,决定子图层内部的绘制顺序。

  • 材质/网格(pc.SORTMODE_MATERIALMESH):不透明子图层的默认模式,尽量减少材质和网格切换,提高性能。
  • 从后到前(pc.SORTMODE_BACK2FRONT):透明子图层默认模式,按由远到近排序,使不同深度的半透明对象正确叠加混合。
  • 从前到后(pc.SORTMODE_FRONT2BACK):由近到远排序。根据 GPU 和场景,减少过度绘制后可能比材质/网格模式更快。
  • 手动(pc.SORTMODE_MANUAL):UI 或 2D 图层的默认模式,按 MeshInstance.drawOrder 排序。元素和精灵组件应放入采用该模式的图层。
  • 无(pc.SORTMODE_NONE):不排序,按加入图层的顺序渲染。

此外,MeshInstance.drawBucket 提供更粗一级的图层内排序。它是 0–255 的整数,默认 127,作为首要排序键,数值越小越先渲染,再在每个桶内按图层排序模式排序。此属性仅在 pc.SORTMODE_BACK2FRONT、pc.SORTMODE_FRONT2BACK 和 pc.SORTMODE_MATERIALMESH 下生效。它可以把网格分成不同绘制桶,无论材质或深度如何,都强制某组先于或晚于其他组,在这些模式下精细控制整体顺序。

默认图层​

应用创建时带有一组默认图层。应保留它们,否则部分引擎功能无法正常工作。默认顺序如下:

默认图层

  1. World(不透明):渲染非透明组件及多数不透明组件网格。
  2. Depth(不透明):捕获场景颜色或深度缓冲区,参见深度图层。
  3. Skybox(不透明):绘制天空盒,位于 World 不透明之后以减少过度绘制。
  4. World(透明):渲染透明组件及其他透明组件网格。
  5. Immediate(不透明):渲染即时模式网格,例如 app.renderLine()。
  6. Immediate(透明):渲染即时模式网格,例如 app.renderLine()。
  7. UI(透明):渲染元素组件。所有元素组件均为透明,因此不使用不透明子图层。

使用自定义图层​

默认图层适合实现现有引擎功能,自定义图层则让你真正掌控内容渲染顺序。

创建图层​

在编辑器 Settings(设置)的 LAYERS(图层)面板中管理图层。

创建图层

输入图层名称并点击 Add Layer(添加图层),新图层会出现在按钮下方的可用图层列表。

设置排序模式​

编辑图层

可在列表中为每个子图层选择排序模式。展开图层,从下拉菜单中选择。

选择图层顺序​

添加图层

点击 ADD SUBLAYER(添加子图层)并选择需要的子图层,将其加入图层组合。进入 Render Order(渲染顺序)列表后,可上下拖动调整顺序。

在图层中渲染实体​

所有绘制网格的组件都有 layers 属性,决定网格加入哪个图层和子图层,包括模型、元素、精灵和粒子系统。相机与灯光组件也有 layers,分别决定渲染和照亮哪些图层。

图层与组件

*注意:*模型被分配到 Test Layer。要显示它,相机列表必须包含 Test Layer;要照亮它,灯光列表也必须包含该图层。

场景通常包含许多渲染网格的实体,建议每个只放入一个图层。通常是 World;需要更多控制时,可分配到 Terrain、Buildings、Characters 等图层。

新场景默认只有一台相机,许多应用只需这一台。需要场景内切换视角、画中画、分屏或渲染到纹理时,可增加相机。

添加相机时,建议:

  1. 设置新旧相机的优先级,控制渲染顺序。
  2. 配置新相机的图层列表。例如俯视地图可能只需要 Terrain 和 Buildings,不需要 Characters。
  3. 如果相机渲染到纹理,通过脚本将渲染目标赋给相机的 renderTarget 属性。