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流程的主要内容,如果未能解决你的问题,请参考以下文章