虚幻4shader 初步研究

虚幻4的渲染管线相当复杂,涉及到多个线程。shader的编译上传等也十分特别,虚幻有自己的一套方法。

在虚幻中编写shader,给人的第一印象就是那个材质编辑器。这个可视化编辑器是美术的福音,但是对于更想使用代码编写高级点儿的效果的人来说感觉并不是那么好。总感觉编写者和引擎shader之间有一个阻挡者,隔着一层,无法真正触碰到shader。


首先我们在材质编辑器里编写的其实并不是shader,只是一片HLSL代码的字符串。并且这些材质节点全部都是c++代码。当我们编译材质的时候,MaterialExpression会将与之对应的HLSL代码提交给HLSLTranslator然后HLSLTranslator会把字符串翻译成HLSL代码然后和USF模板中的代码进行替换,最后才会得到我们需要的shadermap。虚幻的usf文件里面保存的不是shader,而是shader模板和各种函数。


虚幻的vertexbuffer  indexbuffer 的编译上传是通过场景代理完成的,可以参考custommeshcomponent。还有个uniformbuffer在sceneview里可以找到与之相关的代码。在虚幻材质系统里,材质系统负责管理各个shader的各种数据。worldoffset是将偏移数据提交给vertexshader,diffuse specular  等是将数据给fragmentshader,displaced是给曲面细分着色器。虚幻将各个shader需要的数据杂糅在一个材质编辑器里。然而有些shader是虚幻没有暴露出来的,比如几何着色器。这个时候就只能爱莫能助了。虚幻4shader 初步研究
下面是我最新更新的几篇文章:

虚幻4渲染笔记【第一卷:延迟渲染管线】 点击打开链接
虚幻4渲染笔记【第二卷:使用自己的shader】点击打开链接
虚幻渲染笔记【第三卷:虚幻4中自定义global shader代码例子详细解释】点击打开链接