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)
![](https://image.cha138.com/20230219/99e22b38579d403998a805aefb6a76be.jpg)
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)
![](https://image.cha138.com/20230219/1592e77a22af4bb389cec58027c96468.jpg)
MeshShaderMap中的所有MeshShaderMap存放在Shaders数组(根据ShaderType存放): (Shader.h)
![](https://image.cha138.com/20230219/6423b5de9d524d82b675b2a95f1c7b63.jpg)
9.综上,渲染材质从ShaderMap中初始化Mesh的材质对应的Policy流程堆栈如下:
![](https://image.cha138.com/20230219/9600a1f855984d6bbf5ee6a80d3ee724.jpg)
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序列化流程