使用智能材质¶
在材质类型中,您可以使用材质规则自动为材质输入和顶点特性定义着色器预处理器。
使用 Kanzi 默认智能材质¶
Kanzi Studio 提供以下智能材质类型:
SmartPhysicallyBased。请参阅 使用基于物理的智能材质。
SmartVertexPhong。请参阅 使用智能 Phong 材质。
SmartFragmentPhong。请参阅 使用智能 Phong 材质。
要创建您自己的智能材质,请参阅 创建您自己的智能材质。
当您向智能材质添加属性时,Kanzi Studio 会自动创建该材质类型的变体,并为其设置正确的预处理器定义值和属性,以支持您添加的属性。
使用基于物理的智能材质¶
要使用智能基于物理的材质:
在 Library > Materials and Textures 中,按 Alt 并右键单击 Material Types,并选择 SmartPhysicallyBased。
Kanzi Studio 会创建 SmartPhysicallyBased 材质类型和 SmartPhysicallyBasedMaterial 材质。
在 Node Tree 中,选择要使用 SmartPhysicallyBasedMaterial 材质的 3D 节点。在 Properties 中,将 Material 或 Mesh Material 属性设置为 SmartPhysicallyBasedMaterial。
在 Properties 中,点击材质属性旁边的
,转到 SmartPhysicallyBasedMaterial 材质。默认情况下,SmartPhysicallyBasedMaterial 使用金属度-粗糙度工作流,您可以根据材质的金属度和粗糙度来调整材质:
Roughness Factor 将材料的粗糙度设置在从 0 到 1 的范围内:
要获得光滑、有光泽的表面,请将属性值设置为 0。
要获得粗糙、漫反射的表面,请将属性值设置为 1。
Metallic Factor 将材料的金属度设置在 0 到 1 的范围内:
对于电介质材质,请将值设置为 0。
对于反射行为完全类似于金属的材质,将值设置为 1。
可以添加到材质的属性位于 Add Property > Material 上下文菜单中。例如,您可以:
将材质设置为使用纹理。请参阅 创建基于物理的纹理材料。
设置材质可以使用的光源类型和数量。请参阅 为智能材质设置光源数量。
要为材质启用不同的基于物理的功能,请使用 Add Property > Configuration 上下文菜单。
启用某个功能时:
Kanzi Studio 会向材质添加可用于配置该功能的属性。
可用于微调该功能的属性会出现在 Add Property > Material 类别中。
例如,要使用镜面反射-光泽度工作流,请添加 Configuration > Workflow 属性,并将其设置为 Specular Glossiness。
Kanzi Studio 会向材质添加以下属性:
Diffuse Color Factor 设置材质的漫反射颜色。
Glossiness Factor 将材料的光泽度设置在 0 到 1 的范围内:
要获得粗糙、漫反射的表面,请将属性值设置为 0。
要获得光滑、有光泽的表面,请将属性值设置为 1。
Specular Color Factor 设置材质的镜面反射颜色。
使用智能 Phong 材质¶
可以使用以下智能 Phong 材质:
SmartFragmentPhong 是基于像素的冯氏 (Phong) 材质。大部分 GPU 相关计算(包括使用冯氏反射模型应用光源)都在片段着色器中完成。这样可以提供更好的图像质量,但通常会以性能为代价。
SmartVertexPhong 是基于顶点的冯氏 (Phong) 材质。大部分 GPU 相关计算(包括使用冯氏反射模型应用光源)都在顶点着色器中完成。
要使用智能 Phong 材质:
在 Library > Materials and Textures 中,按 Alt 并右键单击 Material Types,并选择 SmartVertexPhong 或 SmartFragmentPhong。
Kanzi Studio 会在 Library 中创建材质类型和材质。
在 Node Tree 中,选择要使用该材质的 3D 节点。在 Properties 中,将 Material 或 Mesh Material 属性设置为您导入的智能 Phong 材质。
在 Properties 中,点击材质属性旁边的
,转到材质属性。添加并设置您要使用的 Material 属性。例如:
要使用纹理,请添加 Material > Texture 属性,并将其设置为您要渲染的纹理。
添加 Texture 属性后,Texture Offset 和 Texture Tiling 属性会出现在 Add Property > Material 上下文菜单中。
要使用立方体贴图纹理,请添加 TextureCube 属性,并将其设置为您要渲染的立方体贴图纹理。
添加 TextureCube 属性后,CubemapColor 属性会出现在 Add Property > Material 上下文菜单中。
默认情况下,智能 Phong 材质支持一个聚光灯。如果您的 Scene 包含多个 Spot Light 节点,请添加 Material > Limit Spot Lights 属性,并将其设置为您要使用的聚光灯数量。
创建您自己的智能材质¶
在这里,您将使用材质规则创建自己的智能材质,该材质可以渲染颜色或纹理,或者同时渲染两者。
要创建您自己的智能材质:
在 Library > Materials and Textures > Material Types 中,创建或选择要为其创建材质规则的材质类型。
例如,创建一个支持渲染颜色或纹理,或者同时渲染两者的自定义材质类型:
在 Library 中,按 Alt 并右键单击 Materials and Textures,选择 Material Type,并将其命名为 SmartColorTexture。
在 Library 中,展开 SmartColorTexture 材质类型,然后双击 Vertex Shader 以在 Shader Source Editor 中打开它。将着色器文件的内容替换为
#version 310 es precision mediump float; in vec3 kzPosition; uniform highp mat4 kzProjectionCameraWorldMatrix; #if USE_TEXTURE in vec2 kzTextureCoordinate0; uniform vec2 TextureOffset; uniform vec2 TextureTiling; out vec2 vTexCoord; #endif void main() { #if USE_TEXTURE vTexCoord = kzTextureCoordinate0 * TextureTiling + TextureOffset; #endif gl_Position = kzProjectionCameraWorldMatrix * vec4(kzPosition.xyz, 1.0); }
单击 Save。
双击 SmartColorTexture > Fragment Shader 以在 Shader Source Editor 中打开它。将着色器文件的内容替换为
#version 310 es precision mediump float; uniform float BlendIntensity; #if USE_COLOR uniform lowp vec4 Ambient; #endif #if USE_TEXTURE in vec2 vTexCoord; uniform sampler2D Texture; #endif layout(location = 0) out vec4 fragColor; void main() { #if USE_TEXTURE vec4 textureColor = texture(Texture, vTexCoord); #endif #if USE_COLOR && USE_TEXTURE float alpha = Ambient.a * BlendIntensity; fragColor.rgb = textureColor.rgb * Ambient.rgb * alpha; fragColor.a = textureColor.a * alpha; #elif USE_COLOR fragColor = Ambient * BlendIntensity; #elif USE_TEXTURE fragColor = textureColor * BlendIntensity; #else fragColor = vec4(0.0); #endif }
单击 Save。
在 Library 中,选择 SmartColorTexture 材质类型。在 Properties 的 Preprocessor Definitions 中添加:
USE_COLOR 键,并将其值设置为 0
USE_TEXTURE 键,并将其值设置为 0
接下来,创建材质规则,根据用户添加到材质的属性来控制这些预处理器定义的值。
创建材质规则:
在 Library 中,选择一个材质类型。在 Properties > Material Rules 中,单击 Add Material Rule。
在 Material Rule 中,设置:
Name 为描述性名称
例如,将其设置为 Use Color。
Material Looks For 为您希望影响此材质规则的属性:
Object Properties 由使用该材质的对象自动提供给材质。您无法将这些属性添加到材质中。
Material Rule Properties 是可在材质规则中使用的自定义属性。请参阅 在材质规则中使用自定义属性类型。
Material Properties 是 Kanzi 属性,当您将其添加到材质时,这些属性就会存在于该材质中。
例如,将 Material Looks For 设置为 Material Properties > Ambient 属性类型。
当您将 Ambient Color 属性添加到 SmartColorTexture 材质类型的材质时,Kanzi Studio 会执行您接下来添加到此规则的动作。
默认情况下,材质规则中的 Found 选项处于启用状态。禁用 Found 选项后,当材质中不存在 Material Looks For 属性时,该规则会执行其动作。
在您创建的 Material Rule 中,右键单击 Actions 并选择:
Set Preprocessor Value 以设置着色器预处理器宏的值
Generate Vertex Data 以生成缺失的网格顶点数据
此动作为没有切线的网格分配切线空间法线贴图。如果网格已有切线,此动作不会重新生成切线。
Make Property Available 以使某个属性仅在材质找到您在材质规则的 Material Looks For 下拉菜单中所选的属性时才对该材质可用。
例如,选择 Set Preprocessor Value,并设置:
Preprocessor Definition Name 为 USE_COLOR
Method 为 Set
这样,您就将预处理器宏的值设置为一个常数值。
要将 Material Looks For 属性的值复制到预处理器宏,请使用 Copy value 方法。
Preprocessor Definition Value 为 1
当用户将 Ambient Color 属性添加到 SmartColorTexture 材质类型的材质时,此动作会将 USE_COLOR 预处理器宏的值设置为 1。
要为纹理的使用创建材质规则,请重复上一步,但需:
将材质规则命名为 Use Texture,并将其设置为受 Texture 属性类型影响。
在 Set Preprocessor Value 动作中,设置 USE_TEXTURE 预处理器定义的值。
单击 Sync with Uniforms。
Kanzi Studio 会向材质类型添加 Ambient Color、Texture、Texture Offset 和 Texture Tiling 输入属性,这些属性的 uniform 是您在顶点着色器中定义的。
在 Property Types 下拉菜单中,选择 Material > BlendMode (Blend Mode)。单击 Sync with Uniforms。
将一个 3D 节点设置为使用 SmartColorTextureMaterial 材质。默认情况下,该材质渲染透明的黑色。
在 Library 中,选择 SmartColorTextureMaterial 材质。在 Properties 中,您可以添加并设置:
Material > Ambient Color 以渲染颜色
Material > Texture 以渲染纹理
添加 Texture 属性时,Kanzi Studio 还会为材质添加 Texture Offset 和 Texture Tiling 属性。
将 Blend Mode 设置为使用颜色混合
默认情况下,材质使用 Opaque 混合模式。
添加在材质规则中使用的属性时,Kanzi Studio 会在 Library > Materials and Textures > Material Types > SmartColorTexture 中创建该材质类型的一个版本,其预处理器定义设置为您在材质规则中定义的值。
在材质规则中使用自定义属性类型¶
要在材质规则中使用自定义属性类型:
创建属性类型。请参阅 创建属性类型。
在 New Property Type 窗口中,启用 Material Rule Property 标志。
现在,您可以在材质规则中使用您的属性类型。该属性类型会出现在 Property Type 下拉菜单中的 Material Rule Properties 下。
在材质规则中使用网格功能¶
要在材质类型中使用网格设置,请选择特定的网格功能作为输入属性:
这些功能不是实际的属性,而是与材质关联的网格的直接功能。当您将材质分配给 Mesh 或 Model3D 时,会生成一个派生材质类型,该类型读取这些网格功能并基于它们执行规则。如果材质类型没有与网格功能相关的规则,则很可能已存在正确的派生材质类型,此时分配不会产生任何效果。
读取的各种网格功能有:
Vertex Color 检查顶点数据中是否存在颜色通道。
如果网格具有顶点颜色,则值为 1,否则为 0。
Vertex Normal 检查顶点数据中是否存在法线通道。
如果网格具有顶点法线,则值为 1,否则为 0。
Vertex Tangent 检查顶点数据中是否存在切线通道。
如果网格具有顶点切线,则值为 1,否则为 0。
Morph Data Normal 检查变形目标数据中是否存在法线通道。
如果网格的变形目标具有法线,则值为 1,否则为 0。
Morph Data Tangent 检查变形目标数据中是否存在切线通道。
如果网格的变形目标具有切线,则值为 1,否则为 0。
Morph Data Texture 检查渲染变形是否需要变形数据纹理。
如果需要网格变形数据纹理,则值为 1,否则为 0。
请注意,也可以检测 Model3D.MorphDataTexture 属性,但最好检测实际的网格数据功能,因为该功能是网格固有的,不需要设置属性。
Morph Target Count 读取与网格数据关联的变形目标数量。
该值等于网格的变形目标数量;如果没有变形数据,则为 0。
Bone Count 读取与网格关联的骨架(骨架数据)中的骨骼数量。
该值等于骨架中的骨骼数量;如果没有骨架数据,则为 0。
为材质规则添加条件¶
在材质规则中,您可以创建条件,只有满足这些条件时,规则才会执行其操作。材质规则条件使用关系运算符将规则属性类型的值与常数值进行比较。
要在材质规则中创建条件,影响该规则的属性类型的数据类型必须为布尔值、枚举或整数值。
仅当材质规则的属性类型的值满足该规则中的所有条件时,该材质规则才会执行其操作。
例如,SmartVertexPhong 材质类型有一条材质规则:如果变形目标的数量大于四,则启用变形数据纹理。