UE4-渲染时初始化Policy上Shader流程

Posted RapdoZoro

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了UE4-渲染时初始化Policy上Shader流程相关的知识,希望对你有一定的参考价值。

文章为本人学习虚幻4引擎源码所整理笔记,如有纰漏欢迎指正交流。

1.当模型被添加到场景中时,StaticMesh最终会被添加到Scene的DrawList中(详细可看笔记“StaticMesh添加到场景DrawList步骤”), 添加时机为在策略工厂DrawingPolicyFactory的AddStaticMesh中创建DrawingPolicy策略,并将Mesh和FDepthDrawingPolicy策略策略加入到Scene的DepthDrawList绘制列表中: 调用堆栈如下: 2.在BasePassOpaqueDrawingPolicyFactory::AddStaticMesh()方法中,会执行ProcessBasePassMesh()来处理基础通道的Mesh  (BasePassRendering.cpp) 3.在ProcessBasePassMesh()方法中,会执行DrawBasePassStaticMeshAction::Process(), 在Process()中会创建BasePassDrawingPolicy策略,并将策略和Mesh一同添加到Scene的BasePassDrawList中:    (BasePassRendering.cpp) 4.在Process中创建了BasePassDrawingPolicy策略,在其构造函数中,调用了GetBasePassShaders()来对这个Mesh对应的Policy的Shader进行初始化:  (BasePassRendering.cpp) 5.在GetBasePassShaders()中,会根据传入的LightMapPolicyType来实例化对应的Shader: (BasePassRendering.cpp)

 

6. GetUniformBasePassShaders()这个函数就把Policy需要的所有Shader模板根据各种符号从Material中拿出来,包括HS、DS、VS、PS等(在这里通过Material的ShaderMap获取VS\\PS Shader):(BasePassRendering.cpp)

7.在上一步中,Material调用GerShader(), GameThreadShaderMap是FMaterial成员变量,FMaterialResource是FMaterial的子类, 一个UMaterial对应多个FMaterialResource(按照FeatureLevel、QualityLevel) 一个FMaterialResource对应一个FMaterialShaderMap实例; 一个FMaterialShaderMap实例对应多个MeshShaderMap(按VFType存); 一个MeshShaderMap对应多个Shader(按ShaderType存)。 先根据传入VertexFactoryType从GameThreadShaderMap中获取MeshShaderMap, 再根据传入策略的ShaderType从MeshShaderMap中把对应Shader中取出来; GameThreadShaderMap以及OrderedMeshShaderMap、Shaders都是之前注册好的:    (MaterialShared.cpp)

 

8.以下为根据VFType在MaterialShaderMap中查找MeshShaderMap方法: (MaterialShared.cpp) MaterialShaderMap中的所有MeshShaderMap存放在OrderedMeshShaderMap数组(根据VFType存放): (MaterialShared.h) 以下为根据ShaderType在MeshShader中查找Shader方法: (Shader.h)

 

MeshShaderMap中的所有MeshShaderMap存放在Shaders数组(根据ShaderType存放): (Shader.h)

 

9.综上,渲染材质从ShaderMap中初始化Mesh的材质对应的Policy流程堆栈如下:

10. 拿到Shader之后Policy调用Draw方法,RHIComList再调用更底层。最终Mesh就这么被绘制出来了。(这部分会单独详细写一篇笔记)

以上。

 

以上是关于UE4-渲染时初始化Policy上Shader流程的主要内容,如果未能解决你的问题,请参考以下文章

UE4-渲染时初始化Policy上Shader流程

UE4-渲染时初始化ShaderResource的Shader流程

UE4-渲染时初始化ShaderResource的Shader流程

UE4-渲染时初始化ShaderResource的Shader流程

UE4-Loading时材质Shader序列化流程

UE4-Loading时材质Shader序列化流程