【材质编辑器全解第一卷】Unity,UnrealEngine4等各大引擎材质编辑器原理详解
2018-03-14 22:20
1106 查看
现在是2018年,材质编辑器现在在各大引擎,3D软件都非常普遍。那么它们是如何工作的呢。 其本质是,一个可视化节点就包含一段HLSL或者cg或者OpenGL代码,通过我们的“连线”将HLSL代码拼接出来。最后会出一张shader文件。对于早期的Unity和大部分3D软件的节点化材质编辑器来说,它们的shader代码比较简单,总共shader代码加起来可能也不会超过2千行,对于这一类的材质编辑器来说,它们的会将可视化的节点的shader代码直接填充到vertexshader或者fragmentshader中。还有一类比较复杂的,比如虚幻4的材质编辑器,这些可视化节点所生成的只是一堆函数而已。
下面就以虚幻4的材质编辑器为例,来详细研究虚幻4的材质编辑器是如何工作的。
虚幻的材质编辑器会最后生成一个HLSLCode文件,可以在window->HLSLCode面板中查看到。其实这里面储存的是一顿函数。
当我们点击Compile之后,引擎会依次调用每个节点的Compile函数
这个Compile函数会调用HLSLMaterialTranslatorCompiler->CustomExpression(this, CompiledInputs);HLSLMaterialTranslator会执行将节点的字符串压入上面的那个materialHLSLCode里面(引擎的材质编辑器打开的那个shader代码文件)。大概的过程是这样的。那么下面就来研究一下,到底是如何将字符串压入HLSLCode文件的。
首先在节点代码压入HLSLCode之前,这张HLSLCode并不是空的,而是有一个模板的。然后HLSLTranslator会在这个模板框架下,将红线的那些字符串填充到这个模板中,最后点击Compile之后就会生成文章开头那个截图里的HLSLCode了。这个模板在Shader目录下 private->MaterialTemplate.usf里。如果你想让你材质编辑器的那个HLSLCode文件包含你的usf文件你可以直接在MaterialTemplate.ush中include你的usf文件。这样在编译材质后,你自己的ush文件将被包含进去。
这样你的customnode就可以直接调用你的ush里的shader函数了。
这样就可以轻松实现CustomNode里的代码调用。但是这样会比较麻烦。因为你稍微改动一下usf,ush就会有很多shader需要编译成shadercache
话题转回来继续我们的材质编辑器原理。HLSLTranslator会将字符串压入HLSLCode里,它是把一个名叫MaterialTemplate.usf的文件作为框架来塞的。我们只要在那些顶下的字符串中添加我们的字符串即可将我们自己的代码塞进材质编辑器的HLSLCode中。我们可以改一下引擎做个实验
打开HLSLMaterialTranslator.h文件,找到virtual int32 CustomExpression( class UMaterialExpressionCustom* Custom, TArray<int32>& CompiledInputs ) override函数,我们做如下修改:
编译一下引擎,再打开材质编辑器的HLSLCode,你将会看到
我们的代码加进去了!!!(注释也是代码,别看不起注释!!!)
当然你加如正常的一个函数也是可以的。这样就可以实现CustomNode的函数调用了。下一节我们一起来自己做一个可以函数调用的CustomNode
下面就以虚幻4的材质编辑器为例,来详细研究虚幻4的材质编辑器是如何工作的。
虚幻的材质编辑器会最后生成一个HLSLCode文件,可以在window->HLSLCode面板中查看到。其实这里面储存的是一顿函数。
当我们点击Compile之后,引擎会依次调用每个节点的Compile函数
这个Compile函数会调用HLSLMaterialTranslatorCompiler->CustomExpression(this, CompiledInputs);HLSLMaterialTranslator会执行将节点的字符串压入上面的那个materialHLSLCode里面(引擎的材质编辑器打开的那个shader代码文件)。大概的过程是这样的。那么下面就来研究一下,到底是如何将字符串压入HLSLCode文件的。
首先在节点代码压入HLSLCode之前,这张HLSLCode并不是空的,而是有一个模板的。然后HLSLTranslator会在这个模板框架下,将红线的那些字符串填充到这个模板中,最后点击Compile之后就会生成文章开头那个截图里的HLSLCode了。这个模板在Shader目录下 private->MaterialTemplate.usf里。如果你想让你材质编辑器的那个HLSLCode文件包含你的usf文件你可以直接在MaterialTemplate.ush中include你的usf文件。这样在编译材质后,你自己的ush文件将被包含进去。
这样你的customnode就可以直接调用你的ush里的shader函数了。
这样就可以轻松实现CustomNode里的代码调用。但是这样会比较麻烦。因为你稍微改动一下usf,ush就会有很多shader需要编译成shadercache
话题转回来继续我们的材质编辑器原理。HLSLTranslator会将字符串压入HLSLCode里,它是把一个名叫MaterialTemplate.usf的文件作为框架来塞的。我们只要在那些顶下的字符串中添加我们的字符串即可将我们自己的代码塞进材质编辑器的HLSLCode中。我们可以改一下引擎做个实验
打开HLSLMaterialTranslator.h文件,找到virtual int32 CustomExpression( class UMaterialExpressionCustom* Custom, TArray<int32>& CompiledInputs ) override函数,我们做如下修改:
编译一下引擎,再打开材质编辑器的HLSLCode,你将会看到
我们的代码加进去了!!!(注释也是代码,别看不起注释!!!)
当然你加如正常的一个函数也是可以的。这样就可以实现CustomNode的函数调用了。下一节我们一起来自己做一个可以函数调用的CustomNode
相关文章推荐
- 【Unity编辑器】Unity基于模板生成代码的原理与应用
- Google V8 引擎 原理详解
- Unity引擎及编辑器C#源代码赏析(一)—目录结构
- Unity引擎及编辑器C#源代码赏析(二)—项目组织
- Unity编辑器扩展之RequireComponent等详解
- unity游戏引擎基础之编辑器菜单栏扩展(三)
- smarty原理详解-仿模板引擎
- Unity编辑器扩展之RequireComponent等详解
- 整合Unity游戏引擎和 Visual Studio Code 代码编辑器 第二弹
- Unity编辑器中Status窗口详解
- 高性能JavaScript模板引擎实现原理详解
- unity粒子编辑器详解
- jQuery-1.9.1源码分析系列(三) Sizzle选择器引擎——编译原理续(伪类选择器“PSEUDO”和子伪类选择器"CHILD"原子选择器详解)
- Unity编辑器中Status窗口详解
- Unity_UnityGUI原理详解
- jQuery-1.9.1源码分析系列(三) Sizzle选择器引擎——编译原理续(伪类选择器“PSEUDO”和子伪类选择器"CHILD"原子选择器详解)
- Unity 地形编辑器详解(V客学院技术分享)
- 【材质编辑器全解第二卷】UnrealEngine4的材质编辑器中实现函数调用
- 【Ogre引擎架构】第六讲 纹理拆分的艺术-九宫格原理详解
- Unity引擎及编辑器C#源代码发布