向 Prism 渲染图形添加阴影

../../_images/car-shadows.png

以下步骤介绍如何向 Prism 渲染图形添加不同类型的阴影,以及如何定义哪些对象投射阴影。

有关 Prism 图形的介绍,请先参阅 Prism 图,了解创建基础 Prism 图形的分步说明。

场景设置

创建可用于测试阴影的基础场景。

  1. 将要投射阴影的对象添加到场景中。

    本示例使用一个地面盒子和 Kanzi Studio Asset Toolkit 包中的一个汽车模型。您可以使用任何现有的对象进行操作。

  2. 转到 Asset Packages,在资源浏览视图中选择 Asset Toolkit > Car。使用鼠标将汽车模型拖放到场景中。

    ../../_images/drag-drop-car.gif
  3. 通过右键点击 Scene > Create > Box 向场景中添加地面盒子。

    ../../_images/create-box-ground.png
  4. 使用 Properties 面板中的 Transform 3D 属性调整盒子的位置和缩放。

    ../../_images/ground-box-transform.png
  5. 在场景中选择地面盒子。在 Properties 中,转到 Mesh Material 属性,然后点击 Navigate to selected item 按钮以高亮显示该模型的材质。

    ../../_images/select-model.png
  6. 从 Material Type 下拉菜单中选择 SmartPhysicallyBased,将材质类型切换为该类型。

    这样会将材质切换为使用 Smart Physically Based Material 类型,这是使用阴影最简单的方式。智能材质可以轻松地按需启用或禁用着色器功能。要了解有关智能材质的更多信息,请参阅 使用智能材质。

    ../../_images/select-smart-physically-based-material.gif

备注

如果您的工程中还没有 Smart Physically Based Material 类型,可以在 Library > Materials and Textures > Material Types 中右键点击,然后选择 Create > Material Type > SmartPhysicallyBased 来创建一个。

创建新的材质类型时,也会自动向工程中添加一个对应的材质。将该材质用于地面盒子。

../../_images/create-smart-pbr-type.png

阴影材质属性

材质类型默认未启用阴影功能。必须启用着色器,才能支持每种阴影类型。

  1. 点击 Material Type 字段上的 Navigate to selected item,在 Library 中选择 SmartPhysicallyBasedMaterial 类型。

    ../../_images/select-material-type.png
  2. 点击 Properties 菜单右下角的 Add Properties 按钮。启用 Shadow for Directional Light、Shadow for Point Light 和 Shadow for Spot Light。

    智能材质现在已可以接收阴影。

    ../../_images/select-shadow-properties.gif

小技巧

如果工程不使用智能材质,要在自定义材质上启用阴影,需要在材质中设置预处理器定义。

打开 Material Type,向下滚动到 Preprocessor Definitions 部分。将 KANZI_SHADER_RECEIVE_SPOT_SHADOW、KANZI_SHADER_RECEIVE_POINT_SHADOW 和 KANZI_SHADER_RECEIVE_DIRECTIONAL_SHADOW 的值设置为 1 以启用它们。

这会在材质上启用相应的各阴影类型。

../../_images/set-shader-preprocessor-definitions.png

创建 Prism 图

  1. 转到 Library > Rendering > Prism Graphs。

  2. 右键点击 Prism Graphs 文件夹,然后选择 Create > Default Prism Graph。

    对大多数渲染图而言,默认 Prism 图是一个很好的起点。

    ../../_images/create-default-prism-graph.png
  3. 选择要使用该图进行渲染的 Viewport 2D。在视口的 Properties 中找到 Render Pass Prefab 属性,然后从下拉菜单中选择已创建的 Prism 图。

    渲染效果可能看起来与之前相同,但现在使用的是已创建的 Prism 图。

    ../../_images/select-prism-graph.png

聚光灯阴影

  1. 在场景对象上,按住 Alt 并右键点击以打开对象创建菜单。选择 Spot Light 以创建新的聚光灯。将聚光灯移动到能照亮对象并投射阴影的位置。

    ../../_images/create-spotlight.png
  2. 在 Library 中 双击 Prism 图以将其打开。

    ../../_images/open-default-prism-graph.png
  3. 向图中添加一个新的 Generate Shadow Map 节点。在 Light 下拉菜单中选择聚光灯。

  4. 点击 + 图标并选择 Shadows > Spot Shadow Map,将 Spot Shadow Map 属性添加到 Multi-Draw 节点。

  5. 将 Generate Shadow Map 节点的输出插槽连接到 Multi-Draw 节点的 Spot Shadow Map 插槽。

    ../../_images/building-spotlight-graph.gif

    图现在已完成,对象应会投射聚光灯阴影。

    ../../_images/car-spot-shadows.png

调整阴影接触点

有时阴影可能看起来略微浮在表面上方。阴影具有近平面和远平面设置,用于定义阴影贴图的深度范围。这两项设置都会影响阴影与表面的对齐方式。

可以通过向光源添加 Camera Near、Camera Far 和 Shadow Bias 属性来调整这些设置。

../../_images/fix-foating-shadows.gif

小技巧

一个常见问题是阴影痤疮 (shadow acne),即阴影出现斑点或瑕疵。这通常是由阴影贴图中的精度问题引起的。向相应的光源类型添加 Spot Shadow Bias、Point Shadow Bias 或 Directional Shadow Bias 可以改善这一问题。

调整阴影分辨率

可以在 Prism 编辑器中调整阴影贴图分辨率。

点击 Generate Shadow Map 节点上的 + 图标,添加 Width 和 Height 属性并调整其值。

提高分辨率能以牺牲性能为代价改善阴影质量。

../../_images/adding-size-properties.gif

点光源阴影

点光源阴影与聚光灯阴影大体相似,但它从空间中的一个点向所有方向投射阴影。

在 Kanzi 中,主要区别在于如何在 Prism 图中设置阴影贴图分辨率。

  1. 按住 Alt 并右键点击 Scene。选择 Point Light。

  2. 在 Library 中双击该 Prism 图将其打开。

  3. 向图中添加一个新的 Generate Shadow Map 节点,并向 Multi-Draw 节点添加 Point Shadow Map 属性。

    Point Shadow Map 节点将给定的立方体贴图深度合成到 Multi-Draw 通道中。它的插槽需要一个立方体贴图深度纹理作为输入。

  4. 将 Generate Shadow Map 节点的输出插槽连接到 Multi-Draw 节点的 Point Shadow Map 插槽。

  5. 在 Light 下拉菜单中选择点光源。

    光源必须为 Point Light 类型,点光源阴影才能生效。

    ../../_images/building-pointlight-graph.gif

与聚光灯阴影类似,可以向光源添加 Camera Near、Camera Far 和 Shadow Bias 属性来调整阴影外观。有关更多详细信息,请参阅 调整阴影接触点。

Prism 图现在已完成,对象应会投射点光源阴影。

../../_images/final-graph-spotlights.png ../../_images/car-point-and-spot-shadows.png

提高点光源阴影分辨率

如果需要调整默认分辨率,可以在 Generate Shadow Map 节点的属性中提高分辨率。

  1. 点击 Generate Shadow Map 节点上的 + 图标,然后添加 Cubemap Resolution 属性。

  2. 将分辨率提高到更高的值(例如 256),以提升阴影质量。

请注意,更高分辨率的阴影可能会影响性能。

../../_images/pointlight-shadow-resolution.png

方向阴影

方向阴影通常用于模拟阳光或其他远距离光源。

其过程与其他阴影类型类似,但方向阴影需要额外的属性来定义阴影区域。

  1. 右键点击 Scene,然后选择 Create > Directional Light。

  2. 选择该光源,然后点击 Properties 面板右下角的 Add Properties 按钮。为其添加 Z Far、Z Near 和 Orthographic Plane Size 属性。

    这些属性定义渲染阴影的区域。调整这些值,使其覆盖需要阴影的区域。Orthographic Plane Size 定义投射阴影区域的尺寸,而 Z Near 和 Z Far 定义深度范围。

    ../../_images/select-directional-properties.gif

    配置完光源属性后,在 Prism 图中设置阴影贴图。

  3. 在 Library 中双击该 Prism 图将其打开。

  4. 向图中添加一个新的 Generate Shadow Map 节点,并为 Multi-Draw 节点添加 Directional Shadow Map 属性。

  5. 将 Generate Shadow Map 节点的输出插槽连接到 Multi-Draw 节点的 Directional Shadow Map 插槽。

  6. 从 Light 下拉菜单中选择该方向光。

    光源必须为 Directional Light 类型,方向阴影才能生效。

    要了解如何调整阴影分辨率,请参阅 调整阴影分辨率。

    图现已完成。

配置了全部三种阴影类型的最终 Prism 图如下所示:

../../_images/complete-shadow-graph.png

现在,所有阴影类型都应在场景中可见。

../../_images/car-spot-point-and-directional-shadows.png

另请参阅

Prism 图

创建 Prism 图

使用 Prism 图创建泛光效果