原文:https://zhuanlan.zhihu.com/p/72509370
UE4场景和场景管理(Scene 、SceneManager)
Scene与UWorld和FScene
- UE4 Scene有UWorld和FScene组成
- UWorld用于游戏线程,包括用户的主动行为,如物体的创建和删除。
- FScene用于渲染线程,包括物体的被动行为。
- UWorld和FScene一一对应
UWorld和ULevel和ULevelStraming
- UWorld由持久关卡(ULevel)和子关卡组成。子关卡可以动态加卸载,也被称为流关卡(ULevelStreaming)
- 流关卡(ULevelStreaming)加载和卸载由UWorldComposition负责。由基于视点距离和流关卡卡包围盒的简单的加载策略实现
- 具体物体放置在关卡活流关卡中,而不是在UWorld中
FScene
- FScene不具备复杂的场景管理功能
- FScene有以下结构
数组:用于管理各种可渲染对象和灯光
Octree:用于灯光和可渲染对象的快速查找
DrawList:用于Cache各个渲染指令
SceneObject
- 将具体物体放入场景(即关卡和流关卡)中的时候,各个独立物体是由AActor及其子类的对象实例来建模表达
- AActor和其子类不直接持有渲染数据,具体的渲染相关的数据均在UActorComponent及其子类的实例中。
- 渲染相关的主要Component类结构层次如下
UE4渲染API封装
- UE4中的渲染API封装是个独立的模块(Module),他们把它命名为RHI(Render Hardware Interface)
- RHI的转发实现在RHICommandList.h文件里,除了基本的条件判断,大都是直接 转调渲染API实现的RHI子模块里的渲染指令。
UE4的材质系统
- UE4对材质系统的封装可以理解为RenderPipeline输入的所有数据中除了几何体数据之外的所有其它数据。
材质
- 材质分为材质模块(UMaterial)和材质实例(UMaterialInstance),两者继承自UMaterialInterface
- UMaterial材质模板带有可编辑的节点图并可据此生成对应的Shader组合
- UMaterialInstance材质实例则只需要引用UMaterial对应的Shader且只能修改材质模板暴露出来的材质参数。
FMaterialResource
- 没关UMaterial中含有多个FMaterialResource,其继承自FMateriale。其负责为各个渲染API和材质所支持的各种质量等级生成对应的Shader组合
FMaterialRenderProxy
- FMaterialRenderProxy是FMaterial用于渲染线程的代理,它可以透过FMaterail和UMaterialInterface访问到Shader、渲染状态,光照模型等所有用户设置好的材质参数。
- UE4的材质中光照模型是不可定制的,除非修改源码
UE4中Shader生成
- UE4的shader基类为FShader,其有两个主要的子类FGlobalShader和FMaterialShader
- FGlobalShader:全局Shader,会自动注册到全局ShaderCache中
- FMaterialShader:用于材质(编辑器)的Shader,所有的后处理、UI、用于模型渲染的Shader都是它的子类。
- UE4 Shader生成分两部分
第一部分是把材质编辑器中的节点图编译成HLSL代码,这一部分是通过FHLSLMaterialTranslator来完成的。
第二部分是把HLSL生成多平台的Shader代码,如Windows上的HLSL,Android上的GLSL,IOS上的MetalShader。