UE4-注册已序列化Shaderl流程

Posted RapdoZoro

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了UE4-注册已序列化Shaderl流程相关的知识,希望对你有一定的参考价值。

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

1.UMaterial::PostLoad( ) 时,进入注册:   (Material.cpp)

LoadedMaterialResources、MaterialResources为UMaterial成员变量:      Material.h

2.PostLoad( )中调用了ProcessSerializedInlineShaderMaps( )方法: 在该方法中会:     1).遍历所有LoadedMaterialResources中的MaterialResource,将其注册到ShaderMap中;     2).将LoadedMaterialResources中中的MaterialResource按照 QualityLevel、FeatureLevel初始化到MaterialRes ources中;   Material.cpp

 

3.上一步遍历的每一个MaterialResource调用的RegisterInlineShaderMap()如下:

(FMaterial为FMaterialResource的基类,GameThreadShaderMap为FMaterial成员变量)   (MaterialShared.cpp)

4.继续进入,查看对材质的每个MaterialResource的MaterialShader注册,会调用void FMaterialShaderMap::RegisterSerializedShaders(),遍历MaterialShader的所有MeshMaterialShaderMap(存放在OrderedMeshShaderMaps,在序列化后已初始化),对每一个MeshMaterialShaderMap进行注册:( 在这里最后就把MeshShaderMaps清空了,应该是注册之后就用不到了吧,只用OrderedMeshShaderMaps就行)           (MaterialShader.cpp)

5.接下来看看对每一个MeshShaderMap是如何注册的:

1).遍历之前序列化好的SerializedShaders,对所有Shader执行Register()、RegisterSerializedResource();

2).对所有Shader执行AddShader(),根据ShaderType添加到Shaders中;

3).清空SerializedShaders;

4).遍历之前序列化好的SerializedShaderPipelines,对所有Shader执行RegisterSerializedResource();

5).对所有PipelineShader执行AddShaderPipeline(),根据ShaderType添加到ShaderPipelines中;

6).清空SerializedShaderPipelines;            (Shader.h)

 

 Shaders、ShaderPipelines为TShaderMap成员变量,FMeshMaterialShaderMap继承自TShaderMap(与SerializedShaders、SerializedShaderPipelines同一层级):               Shader.h

6.再看以上调用的对每个Shader进行注册的函数FShader::RegisterSerializedResource( ),           将之前序列化好的SerializedResource进行注册,然后将注册好的ShaderResource赋值给Resource变量:      (Shader.cpp)

SerializedResource、Resource为FShader成员变量:      (Shader.h)

7.再来看看ShaderResource的注册做了啥:      (Shader.cpp)

其实就是根据ShaderResourceId添加到ShaderResourceIdMap中,ShaderResourceIdMap为FShaderResource成员变量。      (Shader.h)

至此,之前序列化好的Shader全都注册完成,注册完成的Shader存放在每个MeshMaterialShaderMap的Shaders、ShaderPipelines中(之前同层级的序列化后的SerializedShaders、SerializedShaderPipelines清空)。

以上是关于UE4-注册已序列化Shaderl流程的主要内容,如果未能解决你的问题,请参考以下文章

UE4-注册已序列化Shader流程

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

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

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

UE4-Archive序列化哈希表及内存分配

UE4-Archive序列化哈希表及内存分配