材质类型和材质

材质类型定义了材质的属性类型。通过调整由材质类型定义的材质属性值,您可以设置材质的外观。每种材质类型都有一个顶点着色器和一个片段着色器,它们设置了您可以在材质中使用的属性类型。

材质可用于设置3D节点和 Material Brush 笔刷的外观。

请参阅 使用网格 和 使用刷子。

在 Library > Materials and Textures 的 Kanzi Studio 中,您可以查看可用的并添加新的材料类型、材料、纹理、画笔和着色器。

../../_images/library-materials-and-textures.png

除了材料属性之外,在材料类型中,您还可以设置用于灯光的属性。灯光属性通常在数组中定义。灯光属性数组中的项目数量指定材料类型允许的灯光数量。在运行时,从活动场景中的灯光中收集灯光,这些灯光的数据具有当前渲染的材料类型中的任何灯光属性。着色器属性可视化从着色器代码解析的着色器输入。请参阅 使用光源节点。

Kanzi Studio 提供了包含来自 <KanziInstallation>/Studio/Asset Library 中的 Kanzi Studio Asset Library 的默认材质类型和着色器集的模板项目。当您创建一个新的 Kanzi Studio 项目时,您可以根据它们提供的材质类型从不同的项目模板中进行选择:

  • 要从不包含任何预定义材质类型的模板开始,请选择 Import material types manually。您可以在需要时从 Kanzi Studio 材质库中添加材质类型到项目中,或者创建您自己的材质类型。请参阅 为您的工程添加材质类型。

  • High performance vertex shaders 模板适用于低精度、高性能的应用程序。它包含基于顶点的着色器。大部分 GPU 相关计算(包括使用 Phong 反射模型应用光源)都在顶点着色器中完成。对于大多数设备来说,这是一个很好的起点。

  • High quality fragment shaders 模板适用于高精度应用程序。它包含基于像素着色器的材质。大部分 GPU 相关计算(包括使用 Phong 反射模型应用光源)都在片段着色器中完成。这样可以提供更好的图像质量,但往往以牺牲性能为代价。

  • Physically based rendering 模板适用于现代应用程序。它包含基于实现了基于物理的渲染 (PBR) 原理的着色器的材质。这些材质的属性表示物理属性(例如金属度),因此便于直观地控制。大部分 GPU 相关计算(包括使用基于物理的光照模型应用光源)都在片段着色器中完成。这样可以在多种光照条件下提供更逼真的渲染效果。

High performance vertex shaders、High quality fragment shaders 和 Physically based rendering 项目模板定义了一组在项目材料库中可用的材料类型,每种材料都有片段和顶点着色器。请参阅 着色器 (Shaders)。

如果您不确定选择哪一组材料,请选择 Import material types manually,并根据需要添加材料。

使用的着色类型通常是导致性能不佳的第一个瓶颈。请参阅 着色器最佳实践。

材质类型绑定

材质类型中的绑定使您能够:

  • 无需编辑着色器代码即可修改着色器统一变量的值。请参阅 Uniform bindings。

  • 将绑定的结果存储到临时变量中,以便您可以在其他绑定中引用。请参阅 临时变量绑定。

Uniform bindings

在材质类型中,顶点和片段着色器定义了可以在该材质中使用的uniforms和属性类型。当使用特定材质类型渲染3D节点时,uniform绑定允许 Kanzi 将值写入渲染状态,并将这些值用于uniforms和属性类型。

请参阅 使用材料类型、着色器 uniform 和 渲染 (Rendering)。

Uniform bindings 使您能够修改材质类型使用的着色器 uniform 的值,而无需更改着色器代码。

例如,您可以使用灯光属性类型的统一绑定来设置场景中特定类型的所有 Light 节点的渲染值。Kanzi 使用该渲染值来渲染场景中使用具有绑定的材质类型的所有 3D 节点。请参阅 控制光照统一变量。

../../_images/textured-default-uniform-bindings.png

在每种材质类型中,Kanzi Studio 会自动为材质类型的 uniform 创建默认绑定。这些绑定的值来自以下任一来源:

  • Uniform binding 函数。

    为了减少内存消耗并提高性能,Kanzi 提供了最常用着色器统一变量的绑定函数。Kanzi 每帧执行所有使用这些函数的绑定。

    请参阅 Uniform binding functions。

    例如:

    kzProjectionCameraWorldMatrix = getProjectionCameraWorldMatrix()
    
  • 从节点或渲染通道读取的属性值。

    • 大多数统一绑定的默认值来自渲染的3D节点的属性。请参阅 属性绑定。

      例如:

      BlendIntensity = {./BlendIntensity}
      
    • 一些常见渲染属性的绑定,例如 kzProjectionMatrix、kzCameraMatrix 和 kzViewport,其默认值来自渲染通道的属性。请参阅 材质类型绑定中的渲染通道属性。

      例如,设置视口位置和大小的 uniform kzViewport,默认情况下绑定到绘制 3D 节点的渲染通道的 Rendering Viewport 属性:

      kzViewport = {##RenderPass/DrawObjectsRenderPass.Viewport}
      

当您向材质类型添加属性时,Kanzi Studio 会为该属性类型创建一个默认的统一绑定。请参阅 为材质类型添加属性。

临时变量绑定

在材质类型中,临时变量绑定使您能够将绑定的结果存储到一个临时变量中。您可以在同一材质类型中的其他绑定中引用此变量。

Kanzi 使用属性类型来识别临时变量。这使您能够:

  • 引用临时变量时无需单独指定其数据类型。属性类型包含有关其数据类型的信息。

  • 检测临时变量之间的冲突。

请参阅 创建属性类型。

Kanzi 在使用该材质类型的节点附加到节点树时,每次都会在材质类型中执行临时变量绑定。例如,当一个临时变量绑定使用 评估 绑定函数遍历存储在范围属性中的一组值时,Kanzi 使用该集合中的不同值渲染每个节点。

请参阅 材质类型绑定中的临时变量。

../../_images/temporary-variable-bindings.png

另请参阅

使用材料

使用材料类型

创建纹理材料

创建透明材料

使用刷子

着色器 (Shaders)

着色器最佳实践

渲染 (Rendering)

绑定 (Bindings)

Bindings expressions 参考

创建属性类型

Factory Content 资源