优化网格

您可以通过减少 Kanzi 应用程序中显示的网格的顶点数据量来提高性能。当您减少网格顶点数据量时,kzb 文件的大小和运行时所需的 GPU 内存量都会减少。

编辑网格特性

您可以使用 Mesh Attributes Editor 更改网格的顶点数据。

例如,您可以使用 Mesh Attributes Editor 删除不使用的属性,并为您的需求选择最佳数据类型。

../../_images/mesh-attributes-editor.png

要编辑网格特性:

  1. 在 Library > Meshes 中,右键单击您要编辑的网格并选择 Open Mesh Attributes Editor。

    在 Mesh Attributes Editor 中,Import 表显示了将网格导入到 Kanzi Studio 时属性的语义、维数和数据范围。

    ../../_images/open-mesh-attributes-editor.png ../../_images/mesh-attributes-editor-import-table.png
  2. 在 Export 表中的 Mesh Attributes Editor 中设置这些属性,以控制 Kanzi Studio 如何将网格导出到 kzb 文件:

    • Semantic 设置属性的含义。网格属性的语义与网格使用的材质类型的着色器属性的语义相匹配。

      例如,位置、法线、切线、纹理坐标或颜色向量。

      小技巧

      要查看和编辑材质类型的着色器属性的语义, 在 Library > Materials and Textures > Material Types 中,右键单击一个材质类型并选择 Open Shader Attributes Editor。

    • Semantic Index 设置材质类型中属性的索引。

      例如,正确的纹理坐标。

      每个网格特性的语义索引与具有相同语义的着色器特性的语义索引相匹配。

    • Data Type 设置 Kanzi 在将属性存储到 GPU 内存并导出到 kzb 文件时使用的数据类型。请参阅 设置顶点缓存的正确大小。

    • Dimensions 设置 Kanzi 用于该属性的维数。

      当您导入网格时,Kanzi Studio 会自动设置此值。

    • Output Components 设置 Kanzi 映射属性的组件。

      当您导入网格时,Kanzi Studio 会自动设置此值。

    • Export 设置 Kanzi 导出到 kzb 文件的属性。

      选中要使用的特性的复选框,并清除不使用的特性的复选框。

      确保导出所有与网格正在使用的材质类型的着色器特性相匹配的那些特性。

      在本例中,不会导出切线和纹理坐标特性,原因在于它们并非网格所使用的材质类型的着色器特性。

    ../../_images/mesh-attributes-editor-export-example.png

    在 Mesh Attributes Editor 底部的状态栏显示网格顶点数据的大小,如果您使用当前在 Export 表中设置的值导出 kzb 文件。

    ../../_images/mesh-attributes-editor-status-bar-2.png

设置顶点缓存的正确大小

GPU 具有一定大小的顶点缓存。从缓存中访问网格顶点比从内存中其他地方访问顶点快一个数量级。您可以通过重新排序顶点缓冲区中的顶点和索引,以优化特定缓存大小的网格数据,从而使缓存命中量达到最佳。

例如,16 字节的顶点缓存可以存储位置 + 法线 + 纹理坐标 (XYZ * 2 + XYZ * 2 + UV * 2),但不足以存储位置 + 法线 + 纹理坐标 + 颜色。

要为您的目标硬件设置正确的顶点缓存大小:

  1. 了解您的目标硬件的顶点缓存大小。

  2. 在 Kanzi Studio 中选择 Project > Properties,并在 Binary Export 属性类别中的 Properties 中设置:

    • 将 Optimize Meshes 设置为 enabled。

      当您启用 Optimize Meshes 属性时,Kanzi Studio 将导出网格的顶点缓存设置为使用您在 Target Vertex Cache Size 属性中设置的大小。

    • Target Vertex Cache Size 到目标设备上以字节为单位的缓存大小。

    • 将 Default Vertex Attribute Data Type 为您要用于顶点缓冲区属性的数据类型。

      网格的顶点缓冲区包含一组特性,Kanzi 使用这些特性将数据发送到顶点着色器。

      例如:如果将 Default Vertex Attribute Data Type 属性设置为 Half-float,与 Float 相比,您将网格数据大小减少了一半,但同时也降低了网格的精度。

    ../../_images/optimize-meshes.png

为网格特性设置最佳的数据类型

要优化网格,请为每个网格属性设置占用空间最小且能提供足够视觉精度的数据类型。Kanzi 在将属性存储到 GPU 内存并导出到 kzb 文件时使用该数据类型。使用占用空间较小的数据类型时,kzb 文件的大小和运行时所需的 GPU 内存量都会减少。请参阅 网格特性的数据类型。

要为网格特性设置最佳的数据类型:

  1. 在 Library > Meshes 中,右键单击您要编辑的网格并选择 Open Mesh Attributes Editor。

    ../../_images/open-mesh-attributes-editor.png ../../_images/mesh-attributes-editor.png
  2. 在 Import 表的 Mesh Attributes Editor 中,检查 Data Range 列中的值,以获取您要设置的数据类型的属性。

    Kanzi Studio 用不同的颜色标记网格属性不同维度的数据范围。

    ../../_images/mesh-attributes-editor-import-table.png
  3. 在 Export 表中的 Mesh Attributes Editor 中,使用 Data Type 列中的下拉菜单设置导出数据类型。

    当设置数据类型时,请记住:

    • 请选择占据最少空间但能够提供足够高的视觉精度以满足您需求的数据类型。

      您可以在 Mesh Attributes Editor 底部的状态栏中查看使用您设置的数据类型的网格顶点数据的大小,并在 Preview 中直观地检查渲染的准确性。

      ../../_images/mesh-attributes-editor-status-bar.png
    • 选择一个数据类型,其范围涵盖 Data Range 列中的所有值。请参阅 网格特性的数据类型。

      例如:在大多数情况下,当属性的所有组件的数据范围为 0 … 1 时,您可以将 Data Type 设置为 16_UNORM,当数据范围为 -1 … 1 时,您可以使用 16_SNORM。

      ../../_images/mesh-attributes-editor-data-type-to-16_snorm.png
    • 可用数据类型的列表取决于您的目标图形 API 所支持的内容。请参阅 网格特性的数据类型。

    • 标准化的32位数据类型(32_UNORM 和 32_SNORM)提供最高的精度。标准化数据类型在整个数据范围内提供均匀的精度,而 Float 和 Half-float 数据类型在接近零的值时提供更高的精度,而在较大值时提供较低的精度。

    • 表格列出了用于为不同的网格特性选择导出数据类型的建议。

      语义 (Semantic)

      建议的数据类型

      Kanzi Engine 在导出前进行归一化。

      位置

      基于数据范围

      法线、切线、双切线

      2_10_10_10_SNORM_PACK32

      X

      纹理坐标

      基于数据范围,16_UNORM / 16_SNORM / Float

      颜色

      基于数据范围,8_UNORM / Half-float / Float

      权重 (Weight)

      基于数据范围

      矩阵调色板

      基于数据范围

网格特性的数据类型

下表列出了 Kanzi 支持的网格特性数据类型。

数据类型 (Data Type)

描述 (Description)

范围

float

单精度浮点值(32 位)

半浮点 (Half-float)

半精度浮点值(16 位)

8_SNORM

8 位有符号规范化数值

-1.0f … 1.0f

8_UNORM

8 位无符号规范化数值

0.0f … 1.0f

16_SNORM

16 位有符号归一化

-1.0f … 1.0f

16_UNORM

16 位无符号归一化

0.0f … 1.0f

8_SINT

8 位有符号整数

-128 … 127

8_UINT

8 位无符号整数

0 … 255

16_SINT

16 位有符号整数

-32768 … 32767

16_UINT

16 位无符号整数

0 … 65,535

32_SINT

32 位有符号整数

-2147483648 … 2147483647

32_UINT

32 位无符号整数

0 … 4 294 967 295

32_SNORM

32位有符号归一化

-1.0f … 1.0f

32_UNORM

32 位无符号归一化

0.0f … 1.0f

2_10_10_10_SNORM_PACK32

四分量 32 位带符号的规范化压缩数值,带有:

  • 10 位 X 分量,0..9 位

  • 10 位 Y 分量,10..19 位

  • 10 位 Z 分量,20..29 位

  • 2 位 W 分量,30..31 位

(-1, -1, -1, -1) … (1, 1, 1, 1)

2_10_10_10_UNORM_PACK32

四分量 32 位不带符号的规范化压缩数值:

  • 10 位 X 分量,0..9 位

  • 10 位 Y 分量,10..19 位

  • 10 位 Z 分量,20..29 位

  • 2 位 W 分量,30..31 位

(0, 0, 0, 0) … (1, 1, 1, 1)

另请参阅

使用网格

网格最佳实践

编辑着色器