最近需要将一批材质的shader,转换到另一个效果类似的shader,由于材质数量太多,要指定贴图,各种参数,将会是一项很大的工作,因此就写了个工具,切换shader,并自动将原始材质的参数复制到新的材质。
这项工作本不难,但是开发过程中发现,除了Material的SetTexture,SetFloat等接口,能将部分shader参数读取,并赋值到新的材质,材质Inspector面板上其它参数的读写接口并不明确。
后来通过分析材质文件(xxx.mat)得出与材质面板中参数的对应关系,终于搞定。这里记录分析过程:
首先就是.mat文件了,我们用任何一款txt编辑器打开。
然后,我们修改材质的Inspector参数,并保存,对比之前的文件,看看哪些参数发生了变化,并确认2个shader对应的数据是哪些,代码中进行映射。
下面是.mat文件结构,以及Material类中定义的访问这些数据的接口:
// 表示这是材质文件,对应Material类
Material:
//材质tag设定,使用接口Material.GetTag()读取,Material.SetOverrideTag()接口修改
stringTagMap:
// 渲染类型,面板上的Rendering Mode
RenderType: TransparentCutout
// shader keywords,接口:
// shaderKeywords,EnableKeyword(),DisableKeyword(),IsKeywordEnabled()
m_ShaderKeywords: _ALPHATEST_ON _NORMALMAP
// 贴图数据,接口Texture相关
m_TexEnvs:
// shader中定义的贴图的名字
_BaseColor:
// Tiling 参数
m_Scale:
// Offset 参数
m_Offset:
// shader float 参数,接口:SetFloat,GetFloat
m_Floats
// shader color 参数,接口:SetColor,GetColor
m_Colors
材质的参数,不止这些,而且不同的shader,实现一个效果,可能定义使用了不同的参数,需要我们修改,对比来找到对应关系。