虚幻4及国内部分引擎的shader架构梳理,虚幻4材质研究。

以下纯属个人经验总结,如有错误,还请斧正。


现在的引擎对材质的概念越来越重视。那么材质在传统的shader管线中到底扮演怎样的一个角色呢。下面是我的一个简单梳理:

虚幻4及国内部分引擎的shader架构梳理,虚幻4材质研究。

总的来说,材质就是shader管线参数的辅管理者,它管理了shader管线的各个资源——贴图采样器,常量缓冲区数据等等。它会为shader各个管线提供资源支持。当你完成一个材质之后编译。最后出来的其实还是shader代码。有了上述概念之后,我用虚幻引擎为例,来梳理一下从材质编辑器到最后的shader的整个过程:

首先我们做一个简单的测试材质:

虚幻4及国内部分引擎的shader架构梳理,虚幻4材质研究。

这个材质我做得很简单。现在我们的材质里有了一个采样器,并且这个采样器sample了我一张图,我给这个材质的metallic和rouphness都给了一些值。现在假设我已经完成了我的材质,那么按照虚幻的要求,我点击了材质编辑器左上角的编译按钮,这时候我们的材质编辑器就开始工作了,它开始编译我们的shader代码

你可以打开引擎的源代码Source/Engine/Classes/Materials   这里就有所有我们材质节点的源代码,每个材质节点的源代码里都有一个Compile函数。Compile函数会按照这个节点的定义,按照本节点的功能,调用HLSLTRanslator,把我们的材质节点翻译成HLSL代码。最后所有的节点都会把自己翻译成HLSL代码然后把这些HLSL代码按照我们在材质编辑器里定义的链接方式,制成一张Shadermap。

虚幻4及国内部分引擎的shader架构梳理,虚幻4材质研究。

这张ShaderMap就是我们幸苦的成果啦:(点击WIndow的HLSL按钮就可以看到我们的材质编译出的ShaderMap)

虚幻4及国内部分引擎的shader架构梳理,虚幻4材质研究。

然而这张ShaderMap就是我们的最终shader吗。答案是否定的,其实我们在材质编辑器里忙碌了半天,仅仅只是做了shader总量的很少很少一部分,我们可以在shadermap中找到我们刚才的工作痕迹:

虚幻4及国内部分引擎的shader架构梳理,虚幻4材质研究。

可以看到,我们的工作量太少了,只占整个shadermap的1%左右的代码量。然而这个ShaderMap还不是我们的整个shader。这张ShaderMap只是我们整个shader管线的参数收集管理者,真正在跑shader逻辑大部分工作的,是虚幻引擎源码里shader目录下那一大片shader代码。那么现在我们就继续我们的探索之旅。

现在我们将我们制作的材质参数全部收集了起来,diffuse,贴图,metallic,normal,并且把他们翻译成了HLSL代码,下一步需要真正处理它们,用这些资源数据计算我们想要的结果。

我们来到虚幻的shader源码:

虚幻4及国内部分引擎的shader架构梳理,虚幻4材质研究。

找到BasePassVertexPass.usf  这个文件里的Main就是我们的顶点着色器了,它会处理我们的顶点数据。我们的材质提供的WorldOffset就会在这里面处理。

虚幻4及国内部分引擎的shader架构梳理,虚幻4材质研究。

这里面还有很多其他的东西,有兴趣可以自行研究。

再经过各种曲面细分几何着色器之后会来到像素着色器:

虚幻4及国内部分引擎的shader架构梳理,虚幻4材质研究。

可以在这个函数里找到如下调用:

虚幻4及国内部分引擎的shader架构梳理,虚幻4材质研究。

这个函数就会调用我们shadermap里的函数

虚幻4及国内部分引擎的shader架构梳理,虚幻4材质研究。

这里就会抽取我们材质里的参数了。


这个像素着色器就会完成我们的着色工作,如果是延迟渲染的话光照会到后面才会开始计算。这里只会把法线,diffuse等等输出到GBuffer。

渲染管线的下一步就是进行光照渲染了,可以翻到ShadingMode.ush

虚幻4及国内部分引擎的shader架构梳理,虚幻4材质研究。

这里会根据ID来计算光照阴影,高光反射等等光影效果。这个ID是我们在材质编辑器里指认的。

虚幻4及国内部分引擎的shader架构梳理,虚幻4材质研究。


这里就会根据我们的指认进行光影计算了。

最终计算完成的结果再走一遍Postprocess就会输出到屏幕上了(如果没有杂七杂八的混合啥的的情况下)

以上就是整个虚幻4的大概的着色i流程了。

可以看出材质其实就是shader管线的一部分,它允许我们编辑它修改它。然而其余的部分全部是写死的。这样做有几个好处【1】允许美术人员开发shader(在模板里重写shader的一部分)【2】能快速开发shader,因为shader管线早就写好了。缺点就是你想新加一个东西会十分麻烦。