本文转自Unity官方平台公众号,详情请阅读原文链接:
http://mp.weixin.qq.com/s/BjoxI0Lc6wPgLvD_TNLFuw
Unity Labs团队正在研究如何将最为逼真但非实时渲染的影视级资源用于Unity,并让渲染帧率达到60以上。由于电影及电视使用的材质格式与渲染管线(如Ptex、USD及UDIM)并未被实时渲染引擎广泛支持,所以想在Unity中使用这些资源就需要一些新的技术与工具。这些资源除了显而易见的材质尺寸与密度等问题外,通常是将大量的材质和纹理打包在一个单独的素材文件中(如UDIM),而我们需要对这些资源进行便捷交互及快速编辑。为了让该工作流程更流畅,我们开发了全新的多材质编辑器以便于这些素材进行交互和管理。
运用UDIM以及其它多重UV映射技术并不产生新类型的文件,只是UV贴图处理管线和对源纹理文件命名的一些惯例。使用多重UV映射技术可以在并行编辑时支持超出常规数量的材质,并与当前材质检视窗口保持同步,毕竟每次都要手动选择多个材质进行编辑不太现实。
在多材质编辑器中,我们假定每个单独的纹理块都有其相对应的源材质,这也是最常用的工作流。如果这与您正使用的工作流不同,您也可以使用自定义网格导入器在资源文件导入时将网格分割为带有对应材质的独立子网格。
使用步骤
请点击【阅读原文】下载多材质编辑器,下载后将文件导入Unity 5.5或以上版本的项目。导入完成后,在编辑器菜单的Assets项以及项目窗口顶部的Create菜单下会多出一个Multi Material选项,其中包含两种新的Scriptable Object类型,分别是Material Texture Settings和Multi Material Data。
Material Texture Settings用于为UDIM材质指定纹理,该自定义检视窗口可以为选定的材质应用纹理设置,并假定材质与纹理命名均遵循UDIM惯例。其中Texture Name就是材质中纹理字段属性名,SearchDir是包含材质中纹理的文件目录。Multi Material Data保存供Multi Material组件使用的一组材质,也可以从Scriptable Object文件的检视窗口直接更改材质。
Multi Material组件可以添加到任意游戏对象,来控制对象渲染器的Shared Materials数组。从渲染器创建或从项目窗口中指定的Multi Material Data均可在Multi Material组件中进行修改。这在需要同时编辑使用一组共享材质的多个对象时非常有用。
关于多材质编辑器
多材质编辑器工具除了可以指定纹理外,还能与一个或多个游戏对象(使用同一材质)的多材质进行交互。为了实现对材质的最大化控制,我们将材质数据分离到其自己的类中,这样就可以用组件的方式在对象渲染器上中实现材质的创建和序列化,甚至将其作为资源保存在Scriptable Object中,以便于多个游戏对象共用。然后使用单独的自定义绘制类,创建了自定义检视窗口来查看所有材质。这其中既用到了标准材质检视窗口,也支持可能会用到的自定义材质检视窗口。
材质,尤其是Unity中的标准着色器,其检视窗口都使用带有逻辑的自定义UI。因此无法使用标准的属性绘制器来实现材质中的可序列化属性。这就意味着,为了实现与材质的有效交互,就需要自己编写检视窗口实现材质编辑功能。当然,完全可以通过将编辑器绘制方法(使用其公开的GUI方法)插入到另一编辑器或EditorWindow中,来创建并管理内置编辑器。在多材质编辑器中,MaterialArrayDrawers类实现了MultiMaterialEditor和MultiMaterialDataEditor中材质编辑器框的绘制。如果想为自己的Scriptable Object定制检视窗口并支持直接将其用于组件,可以完全复用该多材质编辑器代码。
当尝试在另一编辑器的OnInspectorGUI方法中绘制材质编辑器时,出于对性能与交互限制的考虑有些重要事项需要注意。首先,Header GUI可以修改检视窗口设置栋布局和窗口上下文。另外,如果Header中包含任意控件(如:着色器菜单),就无法使用BeginChangeCheck 和EndChangeCheck来检测其修改。这就表示无法在选中着色器被修改时同步其变化。为了保持着色器修改的同步,我们重新创建了材质的Header,并尽可能将其与DrawMaterialHeaderMaterialView()函数紧密联系。注意,isVisibleField需要使用反射进入材质编辑器中以显示其内容;而ShaderPopup函数尝试复制内置编辑器的绘制风格,但无法在Unity内置着色器未被载入时显示着色器。
其次,由于我们正使用材质编辑器的OnInspectorGUI()函数进行绘制,所以无法得知属性绘制器的变化,只知道OnInspectorGUI()块内容的更改。这就意味着任何对材质的潜在修改都可能需要被同步到其他材质。如果不断同步所有属性,即使是只含一个交互式控件(如:颜色拾取器)的小型材质数组,都可能会显著影响系统性能。
因此,为了实现材质同步时的最佳性能,我们需要一种方案只更新那些被修改的属性。将多个正被编辑的材质与多材质的首个不同的材质进行快速比对,仅缓存那些在两个材质间不同的序列化属性——纹理除外。进而将缓存的变化应用到所有的材质来提高性能。可惜的是,如果各个材质之间差别太大就会出现错误结果,而如果恰好与被比较材质相同时又可能遗漏后面的更新。解决方案是,我们在当前激活材质的Material按钮中添加了同步Sync函数,通过它将该材质的全部属性复制到多材质中。
多材质和其编辑器展示了如何为特定工作流程创建自定义Unity用户界面,您可能会在工作中应用到这些知识。未来我们还将继续分享这样的内容,包括创建更通用化的绘制器以实现在其它组件的检视窗口中显示多编辑器,支持用户选择需要同步的序列化属性(不仅仅是忽略纹理数据),处理动画材质以及实现可与多材质实时交互的脚本等。
暂无关于此日志的评论。