Skip to content

材质编译

matc在编译材质包时尝试验证着色器。下面的例子显示了在编译包含片段着色器错别字的材质定义时生成的错误信息(金属而不是金属)。报告的行号是源材料定义文件中的行号。

ERROR: 0:13: 'metalic' : no such field in structure
ERROR: 0:13: '' : compilation terminated
ERROR: 2 compilation errors.  No code generated.

Could not compile material metal.mat

matc命令行工具的参数如下

FlagValueUsage
-o, --outputpath指定输出路径
-p, --platformdesktop/mobile/all选择编译的目标平台
-a, --apiopengl/vulkan/all选择编译的目标API
-S, --optimize-sizeN/A优化,大小优先,性能优先
-r, --reflectparameters以json的形式输出元数据
-v, --variant-filtervariant变体过滤
  • platform参数:默认情况下,matc生成包含所有支持平台的着色器的材料包。如果您希望减少材料包装的尺寸,建议只选择 合适的目标平台。例如,仅为Android编译一个材料包,运行命令如下:
$ matc -p mobile -o ./materials/bin/car_paint.filamat ./materials/src/car_paint.mat
  • api参数:默认情况下,为OpenGL API生成包含着色器的材质包。除了OpenGL着色器,你还可以选择为Vulkan API生成着色器。如果你打算只针对Vulkan支持的设备,你可以通过只生成Vulkan着色器集来减少材料包的大小:
$ matc -a vulkan -o ./materials/bin/car_paint.filamat ./materials/src/car_paint.mat
  • optimize-size: 此标志应用较少的优化技术,以尝试使最终材料尽可能小。如果默认情况下认为编译的材料太大,则使用此标志可能是运行时性能和大小之间的良好折衷。

  • reflect: 这个标志的设计是为了帮助围绕match构建工具。它允许您以JSON格式打印出特定的元数据。下面的示例打印出在skybox材料中定义的参数列表。它生成一个包含2个参数的列表,分别名为showSun和skybox,分别是布尔值和立方体贴图纹理。

$ matc --reflect parameters filament/src/materials/skybox.mat 
{
  "parameters": [
    {
      "name": "showSun",
      "type": "bool",
      "size": "1"
    },
    {
      "name": "skybox",
      "type": "samplerCubemap",
      "format": "float",
      "precision": "default"
    }
  ]
}
  • variant-filter: 此标志可用于进一步减小编译材料的大小。它被用来指定一个列表的着色器变体,应用程序保证永远不会需要。在代码生成阶段跳过这些着色器变量,从而减少了材料的整体尺寸。这部分应再材质定义中完成,而并不是再命令行中完成,命令行中应用于测试,测试完成后,写入material的block中。