【ue4】【原理】特效系统Cascade与Niagara
Cascade 原理
编辑器
Cascade
的实质是一个编辑器。 就像角色编辑器(Persona)下的骨骼编辑器(SkeletonEditor)、动画编辑器(AnimationEditor)等一样。
下图为整个 Cascade
模块的源码目录, 它位于 Engine\Source\Editor
下。
Cascade
的实质是一个编辑器。 就像角色编辑器(Persona)下的骨骼编辑器(SkeletonEditor)、动画编辑器(AnimationEditor)等一样。
下图为整个 Cascade
模块的源码目录, 它位于 Engine\Source\Editor
下。
UE4 的光源类型有: 平行光 点光源 聚光源 天光(环境光)
也是比较典型的光源类型, 关于这些光源类型的介绍和相关参数, 可参考此篇
【cg】【原理】光照模型 中的预备知识第二条 光源类型
ue 现在还多了个 矩形光源, 个人感觉然并卵
每一种光源都可以设置它的 Transform 信息 和 移动性类型
【Tips】位置信息对于平行光来说是无效的
为了更好地进行光照测试, 我们需要对场景做一些设置。 当然这些设置不是必要的, 只是一些个人的强迫症式的做法, 这里列举一下。
首先给场景加了一个 landscape, 然后增加了一个没有镜面光 (设置
Specular
为 0) 的材质给它, 这样只是个人看起来比较舒服而已-_-增加了 ppv (后处理体积) 和 liv (lightmass重要体积)
然后通过后处理 (post process) 对 GI 产生的光照 (间接光) 修改了一下颜色, 以增加对间接光的辨识
去掉了天空盒
下面我们将按照三类光源 (静态 动态 固定) 分别作用于不同的物体 (静态 动态 固定) 上, 同时对于不同的光源种类 (平行光 点光 聚光) 也作适当的分类讨论。
个人感觉 ue4 的光照系统特别复杂
她把光源按照移动性分为了三类 -- 静态, 固定, 动态
的同时, 也把物体按照移动性分为了相同的三类
这样总的来说就有了9种对应关系
而对于每一种, 不同的光源类型还可能有不同的方案, 如平行光和点光源的方案就有差异
这样算下来情形就有些复杂了
我们只能慢慢地, 一点一点地去实践分析, 再找几个大腿, 踩踩前人的脚步, 实现不行还有源码 ~
UE4 提供了内置的后处理 (Post Process) 阶段 -- 渲染管线的最后一个阶段
UE4 提供的后处理效果
HDR 与 ToneMapping (色调映射 HDR->LDR)
SSAO
MotionBlur -- 动态模糊
AntiAliasingQuality -- 搞锯齿 -- FSAA -- FXAA TAA MSAA
Depth of Field -- 景深
Eye Adaption -- 人眼自适应 -- 自动曝光
Lens Flare -- 镜头眩光
SSR -- 屏幕空间反射 -- 解决动态反射问题
【Tips】 UE 的 SSAO 是在 DeferredShading 中做的, 所以 手机上没有
全局着色器是对固定几何体 (如屏幕四边形) 执行操作但不需要与材质进行交互的着色器
如阴影过滤, 全局后处理, 全局雾 等, 都可以用全局着色器来渲染
【Tips】 一个全局着色器类型在内存中只能有一个
要想实现全局着色器, 必须实现一个继承自 FGlobalShader
的类
1 | class FMyGShader : public FGlobalShader |
【Exp】 -- 旋转 UV
材质表达式 -- 即材质图表中的节点, 用来实现不同材质效果的逻辑
材质函数 -- 材质图表中可重用的节点集合 -- 用以封装可重用的功能
BehaviorTree -- 行为树
BlackBoard -- 黑板 -- 用于共享数据
Decorator -- 先决条件
Service -- 服务
Task -- 任务 -- 执行节点 -- 行为树中的叶子节点
AIController -- AI控制器 -- 联系行为树和黑板并运行行为树的地方
UE4 内置了 寻路体积 (NavMeshBoundsVolume) 来实现某个体积区域的 NavMesh 覆盖
可以按 P 键查看当前 NavMesh 覆盖的地方
可以使用 NavLink 增加跳跃点
我理解的 NavMesh 寻路的原理无非是生成寻路网格,然后跑A*
UMG 作为官方推荐的 UI 系统, 是在 Slate 上又封装了一层
支持可视化的设计界面, 支持 UI 的复用
在控件蓝图 (Widget Blueprint) 里进行编辑
一般只关注于 UI 的显示, 至于事件的绑定及逻辑上的交互, 大都放在游戏逻辑里去写
如果当前的 UI 与 地图的切换无关, 那最好就放到 World 之上那层去实现逻辑
在 AActor 蓝图里, 也可以给 WidgetComonent 指定 控件父类, 从而实现3D场景中交互的UI