【材质编辑器全解第一卷】Unity,UnrealEngine4等各大引擎材质编辑器原理详解

    现在是2018年,材质编辑器现在在各大引擎,3D软件都非常普遍。那么它们是如何工作的呢。
    其本质是,一个可视化节点就包含一段HLSL或者cg或者OpenGL代码,通过我们的“连线”将HLSL代码拼接出来。最后会出一张shader文件。对于早期的Unity和大部分3D软件的节点化材质编辑器来说,它们的shader代码比较简单,总共shader代码加起来可能也不会超过2千行,对于这一类的材质编辑器来说,它们的会将可视化的节点的shader代码直接填充到vertexshader或者fragmentshader中。还有一类比较复杂的,比如虚幻4的材质编辑器,这些可视化节点所生成的只是一堆函数而已。

下面就以虚幻4的材质编辑器为例,来详细研究虚幻4的材质编辑器是如何工作的。
虚幻的材质编辑器会最后生成一个HLSLCode文件,可以在window->HLSLCode面板中查看到。其实这里面储存的是一顿函数。

当我们点击Compile之后,引擎会依次调用每个节点的Compile函数

这个Compile函数会调用HLSLMaterialTranslator
Compiler->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

猜你喜欢

转载自blog.csdn.net/qq_16756235/article/details/79561066
今日推荐