虚幻引擎之WireframeLit模式
文章目录
1 前言
“WireframeLit”是什么?这显然是笔者胡乱取的名字。
- Wireframe,即线框模式;
- Lit,即光照模式;
所以,WireframeLit模式,表示的是在光照模式下,同时显示线框的一个编辑器模式下的观察方式。
这源于美术的一个需求,想要模拟和3DsMax软件中类似的效果,如下所示。
其实,虚幻是可以同时显示线框和光照的,只是不再同一个View中。
通过点击场景编辑器右上角的“重叠方块”,可以将场景编辑器分成四个View,那么就可以设置一个显示线框模式,一个显示光照模式。
然而,美术肯定不会放过你的,这样明显不同于3DsMax。(求放过!
2 模式的实现
2.1 实现方案
很明显,这是一个比较简单的需求,实现的方案就是只需将Mesh绘制两次即可。
一次为光照模式,另一次为线框模式。
那么为何还需要写呢?无他,就是记录下一些实现过程中的细节。
大概梳理一下需要实现哪些东西:
- 添加一个ViewMode选项UI;
- 渲染逻辑的修改,实现绘制两遍,一遍是正常材质的光照模式,另一遍是线框模式。
注,其实从之前的文章虚幻引擎之SecondPass支持已经可以看到基本的实现思路。考虑静态Mesh和动态Mesh分别处理。
2.2 实现细节
2.2.1 ViewMode的UI
所涉及修改的文件如下:
EngineBaseTypes.h
ShowFlagsValues.inl
ShowFlags.cpp
ViewModeNames.cpp
EditorViewportCommands.h/cpp
SEditorViewport.cpp
SSCSEditorViewport.cpp
SEditorViewportViewMenu.cpp
增加ShowFlag枚举
EngineBaseTypes.h
在EViewModeIndex中增加枚举量:
UENUM()
enum EViewModeIndex
{
//... 省略部分源码
// 笔者添加
VMI_WireframeLit = 29 UMETA(DisplayName = "Wireframe Lit"),
// 虚幻源码,在这部分前添加
VMI_Max UMETA(Hidden),
VMI_Unknown = 255 UMETA(DisplayName = "Unknown"),
};
ShowFlagsValues.inl
// 找到VMI_Wireframe源码这个位置,在下面添加
/** needed for VMI_Wireframe and VMI_BrushWireframe */
SHOWFLAG_FIXED_IN_SHIPPING(0, Wireframe, SFG_Hidden, NSLOCTEXT("UnrealEd", "WireframeSF", "Wireframe"))
// 笔者添加 VMI_WireframeLit
SHOWFLAG_FIXED_IN_SHIPPING(0, WireframeLit, SFG_Hidden, NSLOCTEXT("UnrealEd", "WireframeLitSF", "WireframeLit"))
- ShowFlagsValues.inl 会被ShowFlags.h中的struct FEngineShowFlags类使用。生成一个成员属性。
添加这个Flag标记的思路如下:
- 若开启WireframeLit,就可以通过这个标记来开启光照模式下,再加上线框的渲染。
ShowFlags.cpp
FindViewMode函数中添加:
// 笔者添加,返回对应的枚举
else if (EngineShowFlags.WireframeLit)
{
return VMI_WireframeLit;
}
// 虚幻源码&#