BlueRose
文章97
标签28
分类7
MultiDraw中文文档

MultiDraw中文文档

简介

本插件通过UnrealEngine的MeshDraw框架实现类似Unity的多Pass效果,无需后处理即可实现BackFace描边、剖切效果。并且可以让一个部位同时渲染Unlit与Lit光照模式的Material。

注意:因为UE5.4修改了UStaticMeshComponent的虚函数GetUsedMaterials的标记为final,所以导致插件不能正常运行。为了避免崩溃问题,所以停用了OutlineStaticMeshComponent、MultiDrawStaticMeshComponent的功能。可使用再添加一个StaticMeshComponent并赋予Outline材质的方法临时解决。

MultiDraw5.0案例项目
MultiDraw5.1~5.3案例项目
MultiDraw5.4案例项目
MultiDraw5.5案例项目
使用方法:下载在Plugins文件中放入MultiDraw,即可运行。
注意:本项目只有5.0及以上版本才可以打开。

更新日志

2024.5.1

  1. 更新UE5.4版本,因为引擎源码发生改变为了避免崩溃,停用了OutlineStaticMeshComponent、MultiDrawStaticMeshComponent的功能。

2023.8.1

  1. 增加ProceduralMeshComponent与DynamicMeshComponent的MultiDraw版本.

2023.7.28

  1. 更新CurveWidthControlOutline方案。
  2. 增加ProceduralMeshComponent与DynamicMeshComponent的Outline版本。

2023.3.29

  1. 更新MultiDraw通过指定材质ID来控制绘制的功能。

2022.12.19

  1. 更新UE5.1版本。
  2. 支持OverlayMaterial。
  3. Outline与MultiDraw现在支持Translucent材质。

2022.10.30

  1. 更新实时更换材质功能。

快速入门

描边案例:

  1. 新建一个Actor蓝图类并挂载OutlineComponent。
  2. 设置模型以及材质。
  3. 创建Outline材质并且放入OutlinePassMaterialSet中。
  4. 将这个Actor放入场景中。

MultiPass演示:

  1. 新建一个Actor蓝图类并挂载MultiDrawComponent。
  2. 设置模型以及材质。
  3. 根据需要将需要绘制的材质与参数放入PerPassDrawSettingses中。
  4. 根据需求给材质设置PixelOffset,以便让材质按照想要顺序进行渲染。
  5. 将这个Actor放入场景中。

剖切案例:

  1. 进入Simulation模式。
  2. 旋转Plant模型即可。

说明

OutlineComponent

组件名为OutlineSkeletalMeshComponent与OutlineStaticMeshComponent。材质为一对一模式,即Mesh中Material Element Slot Index与OutlinePassMaterialSet中的相同。如果不想绘制只需要将OutlinePassMaterialSet中对应材质设置为空即可。

选项:

  • CullingMode:所有Outline材质的剔除模式。有正面剔除、背面剔除、与双面渲染3个选项。
  • bCastShadow:所有Outline材质的投影模式。即是否可以投射阴影到其他物体上。
  • OutlinePassMaterialSet:指定Outline材质的数组。

MultiDrawComponent

组件名为MultiDrawSkeletalMeshComponent与MultiDrawStaticMeshComponent。材质为一对多模式,即模型的每个部位都会使用所有指定的材质渲染一次。但是因为深度剔除,所以需要使用深度偏移来控制渲染排序。

选项:

  • CullingMode:材质的剔除模式。有正面剔除、背面剔除、与双面渲染3个选项。
  • bCastShadow:材质的投影模式。即是否可以投射阴影到其他物体上。
  • bDraw:控制材质是否需要渲染。
  • MaterialInterface:指定用于渲染的材质。

角色类

为了方便用户,本插件实现了替换Mesh组件的ThirdPersonChracter类:AOutlineCharacter与MultiDrawCharacter。

代码操作如下:

class AOutlineCharacter : public ACharacter
{
    GENERATED_BODY()
public:
    AOutlineCharacter(const FObjectInitializer& ObjectInitializer);
};

AOutlineCharacter::AOutlineCharacter(const FObjectInitializer& ObjectInitializer)
    : Super(ObjectInitializer.SetDefaultSubobjectClass<UOutlineSkeletalMeshComponent>(ACharacter::MeshComponentName))
{}

描边材质说明

本插件提供了3种Outline材质。

  • ExampleContent\Materials\Outline\M_FixedOffsetOutline:固定WorldPositionOffset的Outline材质,仅用作演示。
  • ExampleContent\Materials\Outline\M_ViewFixOffsetOutline:根据摄像机距离来调整Outline宽度的材质。但在距离较近时,轮廓会变得很细。
  • ExampleContent\Materials\Outline\M_PerfectionViewFixOffsetOutline:修正上面问题的材质。
  • ExampleContent\Materials\Outline\M_CurveControlOutline.uasset:使用曲线控制描边宽度。

M_CurveWidthControlOutline方案比较完美,强烈推荐使用。如果对于控制效果不满意可以自行修改曲线来调整效果。

  • 曲线的R通道用来控制模型与摄像机的距离对于描边宽度的影响。
  • 曲线的G通道用来控制摄像机FOV对于描边宽度的影响。

组件并没有限制材质类型,所以也可以使用其他ShaderModel的材质来制作你想得到的效果。

实时更换材质功能

取得对应组件,调用函数即可。对于SkeletalMesh需要确保材质有勾选Use for SkeletalMesh 以及Use for cloth。

其他平台效果

只在编辑器里进行了测试。