UE4中的使用要领

官方网站:https://edu.battlefire.cn

简介

本文开始我们为同学们展示,从一个U3D程序员出发,或者从一个引擎程序员出发,你应该如何来定位UE4。因为UE4跟一般的引擎还真滴是不一样的。

关于Shader

或许这是很多程序员上来就想研究的问题,毕竟高端嘛。那么当你使用UE4的时候,UE4是推荐你尽可能不要写shader。

为嘛UE4不要你写shade呢?因为你要写shader,那就得理解人家引擎内核的搞法,你写的shader引擎内核怎么调用你知道吗?不知道那还怎么写。这或许是UE4的强大也是UE4的伤痛。只有顶级程序员能给UE4写shader。

与U3D对比

与U3D对比,UE4可以说是更游戏引擎的一个东西,U3D是一个残缺的半成品,但是这样的半成品的好处就在于我可以玩出很多花样。

而UE4,大部分人都可以做成差不多一样画质的游戏,只有少部分人做出来的游戏可能性能会明显比其他人做出来的游戏性能好。

UE4帮你调好了所有参数,随便来个人,扔几个模型进去,调一调参数也能出一个电影级画质。而且UE4作为一个历史悠久的游戏引擎,它对渲染的描述以及架构是非常到位的。这也是一般人不会在UE里写Shader的原因,因为UE4的级别太高了,没照顾小菜鸟。

UE4也非常激进的只支持ES3.1和SM5的硬件。

多线程渲染

UE采用的是多线程渲染,渲染线程里的东西与逻辑线程里的东西是分开存储的,所有绝大部分类为了解决这样的一个多线程架构带来的问题,都会把数据分开存储。渲染线程只会访问渲染线程该访问的数据对象,而逻辑线程也只访问逻辑线程该访问的数据对象。

UWorld:一个UWorld包含了若干个Actor和Component,它们之间可以互相交互。UWorld可以采用Stream的方式加载Level或者卸载Level,并且多个World可以同时被激活。

ULevel:一个Level由若干个Actor和Component组成,它们被保存在Map文件里,加载一个Level的时候会同时把它们都加载进来,卸载一个Level的时候,这些Level里的物体也会同时被卸载。

USceneComponent:那些可以被加载到FScene里去的物体的基类,比如灯光、Mesh、雾等等之类的东西。

UPrimitiveComponent:所有的场景中可以被渲染或者是可以进行物理模拟的物体的基类。这些东西同样可以被用于可见性剔除的模块以及渲染特定的数据(比如投射阴影)。就如同UObject类型的物体一样,逻辑线程持有这个对象的所有属性变量和状态,渲染线程不应该直接去访问这个类的对象。

ULightComponent:表示的是一个光源。相关的渲染器需要把它对场景的影响计算出来并合成到最终的场景里面去。

FScene:UWorld的渲染线程里的版本。当一个物体调用RegisterComponent接口之后,这个物体才能被添加到FScene里去。渲染线程控制着FScene的所有状态,逻辑线程不能直接对它进行修改。

FPrimitiveSceneProxy:UPrimitiveComponent的渲染线程里面的版本,它就是在渲染线程里镜像了一份UPrimitiveComponent的各种状态。这个东西存在于Engine模块,它可以被继承,来派生出子类对象用来支持各种不同种类的可被渲染的东西(skeletal、grid、BSP等等)。它会实现一些非常重要的函数比如GetViewRelevance,DrawDynamicElements等等。

FPrimitiveSceneInfo:UPrimitiveComponent和FPrimitiveSceneProxy的内部渲染状态。在Renderer模块里,Engine模块看不到这个东西。

FSceneView:引擎对FScene的一个画面的描述。在FSceneRenderer::Render中,一个Scene可以被渲染成不同的view(Editor中的多视口)或者在FSceneRenderer::Render中的同一个dc中被渲染成多个视口(在游戏中的分屏渲染)。每一帧都会构建一个全新的view。

FViewInfo:在Renderer模块中,一个view的内部renderer的描述方式。

FSceneViewState:在游戏中,每一个ULocalPlayer会有一个view state,view state可以把一个view的渲染信息传递到别的渲染帧里面去。

FSceneRenderer:每一帧都会创建一个这样的实例来存储一些每一帧里面的临时变量。

FMaterial:在渲染线程中被使用的材质的接口类。提供了材质属性的访问接口(比如混合模式)。包含了一个ShaderMap来供渲染器去查询它需要的shader。

FMaterialResource:FMaterial接口的UMaterial的实现

FMaterialRenderProxy:渲染线程里的材质的描述方式。提供了对FMaterial的访问以及当前的常量、向量和纹理参数。

UMaterialInterface:逻辑线程里对材质功能的抽象接口。这个东西被用来去查询在渲染的时候被使用的FMaterialRenderProxy并且UMaterial被用作数据源。

UMaterial:一个材质资源。它需要计算出材质中那些用来着色的属性,设置混合模式等等。

UMaterialInstance:一个UMaterial实例的抽象接口。在连连看里可以给材质提供不同的参数。每一个材质的实例都继承了UMaterialInterface。因此一个材质的实例的爹可能是一个UMaterial或者是另一个材质实例。无论子父关系有多么的长,最终都会追溯到UMaterial基类。

UMaterialInstanceConstant:一个不能在编辑器里修改的材质实例。它可以提供常量,向量纹理以及静态开关变量。

UMaterialInstanceDynamic:一个可以在运行时进行修改的材质实例。可以提供常量,向量以及纹理参数。它无法提供静态开关的参数并且它无法成为另一个UMaterialInstance的父类。

来源:内核观察(neiheguancha) - 疯狂的打字员
原文链接:https://mp.weixin.qq.com/s/Xu6o5WqK0lunOZH8cCe8dg

最新文章