虚幻4渲染模块

原文: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。