材质类型和材质¶
材质类型定义了材质的属性类型。通过调整由材质类型定义的材质属性值,您可以设置材质的外观。每种材质类型都有一个顶点着色器和一个片段着色器,它们设置了您可以在材质中使用的属性类型。
材质可用于设置3D节点和 Material Brush 笔刷的外观。
在 Library > Materials and Textures 的 Kanzi Studio 中,您可以查看可用的并添加新的材料类型、材料、纹理、画笔和着色器。
除了材料属性之外,在材料类型中,您还可以设置用于灯光的属性。灯光属性通常在数组中定义。灯光属性数组中的项目数量指定材料类型允许的灯光数量。在运行时,从活动场景中的灯光中收集灯光,这些灯光的数据具有当前渲染的材料类型中的任何灯光属性。着色器属性可视化从着色器代码解析的着色器输入。请参阅 使用光源节点。
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 节点。请参阅 控制光照统一变量。
在每种材质类型中,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 使用该集合中的不同值渲染每个节点。
请参阅 材质类型绑定中的临时变量。