首页 > 其他分享 >Unreal Engine 物体描边与高亮

Unreal Engine 物体描边与高亮

时间:2023-12-17 17:36:13浏览次数:37  
标签:Engine 高亮 物体 像素 Unreal 描边 材质 模板

  本篇随笔将使用 UE 中的后处理体积以及编写对应的材质参数,来实现物体的描边与高亮功能,要做到物体高亮与描边,需要利用到 UE 提供的 CustomDepth(自定义深度) 和 CustomStencil(自定义模板)两个 Buffer(亦或是在物理上占用一个Buffer,深度和模板占用位数不一样,但逻辑上可视为两个Buffer)。

一、物体高亮

  物体高亮的最简单的逻辑就是将需要高亮的物体写入 CustomStencil ,然后根据 CustomStencil 中的值,将被标记为需要高亮的像素位置混入需要高亮的颜色或是纹理,具体的实现方法如下:

1. 创建一个材质,取一个任意的名字,例如 M_PostProcess_Highlight,将该材质的材质域切换为【后期处理】,此时只有【自发光颜色】可以被连接;

 

2. 按下图所示构造节点并连接,ScreenPosition为屏幕的像素坐标,整体材质的表达含义为,查看当前像素位置是否被写入了大于0的自定义模板值,如果被写入则使用HighlightColor,否则使用原场景颜色;

 3. 保存这个材质,在编辑器的场景中拖入一个【PostProcessVolumn】,然后将该后处理体积对象的属性中的【无线范围(UnBound)】选中,即该后处理体积影响全部区域范围;然后在【后期处理材质】中添加刚才新建的材质【M_PostProcess_Highlight】

 

4. 将物体写入 Custom Depth / Stencil:选中场景中的任意物体(任意继承于 UPrimitiveComponent 的物体),按下图修改其渲染方式;

 5.  查看 CustomStencil 的缓冲区,检查是否物体模板值是否已被写入,若没有写入则需要在【项目设置】->【渲染】->【自定义深度/模板通道】中选择【启用模板】

 

 若有值则说明启用成功

 此时对应的效果如下,两个 StaticMesh 被高亮为绿色

 

二、物体描边

  物体描边相对于物体高亮需要多一步特殊的计算,即数字图像处理中的边缘检测算法,即我们需要在材质中自行实现一个边缘检测算法来决定那些像素是需要被描边的边缘像素,本例中使用拉普拉斯边缘检测方法作为示例。

1. 边缘检测:在图像处理领域,边缘检测一般用于寻找像素值具有梯度的像素位置,即某个像素位置的像素值与周边像素的像素值存在一定差异,可以判定这个像素为某个区域的边缘。拉普拉斯的卷积核如下方所示:

1   1  1

1  -8  1

1   1  1

因此基于对于模板缓冲区中的一个像素而言,我们需要知道其 3x3 范围内的全部像素值。新建一个材质函数 MF_LaplaceEdgeDetection,并加入以下节点与连线,横向与纵向的像素距离偏移量可以用下面的连接方式进行计算,OutlineWidth是描边的宽度。

 然后通过使用横向与纵向的偏移量,可以计算出九个像素位置的实际偏移量

 其中 GetCustomStencilOffset 的方法实现如下:其目的是获取一个屏幕位置加上某个偏移后的 CustomStencil 模板值。

 最后将取出的模板值按拉普拉斯卷积核加加减减,即可得到一个梯度计算结果,若梯度值 != 0,则说明该像素是边缘像素,需要执行额外的处理;

 

 2. 有了两个材质函数后,新建一个后处理材质 M_PostProcess_Outline,按下图添加节点

3. 将这个材质替换到后处理体积中的后处理材质中去,得到以下的结果:

 三、带深度的高亮/描边

如上图所示,上面的通过后处理的高亮与描边在运行时的实际效果会产生深度问题,可以看到红色线绘制在了玩家枪的前方,而实际上红色线应当被遮挡,因此需要额外考虑到深度剔除,材质中可以添加以下的节点来实现这个目的。

如果自定义深度大于场景深度,则说明被描边的物体被遮挡,因此不能通过后处理修改该像素位置的像素值,否则没有被遮挡,正常执行描边操作。

可以看到,经过上述过滤后,红色线不会绘制在玩家枪的前方;

 四、带深度的同时高亮与描边

只需要注意一下顺序,先做高亮后做描边,将材质按下图连接即可

完成啦!

混浅一点

 

标签:Engine,高亮,物体,像素,Unreal,描边,材质,模板
From: https://www.cnblogs.com/thomaszhong/p/17909404.html

相关文章

  • Template Engines for Spring: FreeMarker | Java Server Pages | Thymeleaf | Jade4j
    Besidesthetemplateenginesdescribedsofar,therearequiteafewmoreavailablewhichmaybeused.Let’sreviewsomeofthembriefly.Velocity isanoldertemplateengine,whichisverycomplexbuthasthedisadvantagethatSpringhasdeprecateditsu......
  • MegEngine 正式支持 XLA 啦!
    XLA(AcceleratedLinearAlgebra)是Google提出的一个神经网络编译器,可以用于加速AI模型的训练和推理。MegEngine1.13.1中也已经支持了XLA,在训练模型时可以选择开启此项功能,不同的模型可以获得10%~80%不等的速度提升。主要的目标场景MegEngine现在是动态执行的,即python......
  • 将QWebEngineView添加到QStackedWidget或QTabWidget中导致切换按钮失效的解决方案
    问题描述:将QWebEngineView添加到QStackedWidget或QTabWidget中导致切换按钮失效,如果只有两个来回切的话,是没有问题的,当出现多个页面的时候,就会切换失灵。解决思路:将QWebEngineView浮到上面,只要实现大小、位置、显示隐藏与主页面同步即可。 QWebEngineView窗口构造窗口添加:se......
  • Unreal C++自定义Actor设置StaticMesh和Material
    1.新建第三人称c++游戏(其它模板开局也可以的)2.新建继承自Actor的c++类3.添加静态网格体成员SM_MyActor,并在构造函数中进行相应的初始化UCLASS()classMYPROJECT9S_APIAMyActor:publicAActor{GENERATED_BODY()protected:/**Pleaseaddavariabledescripti......
  • DMAengine controller documentation 【ChatGPT】
    https://www.kernel.org/doc/html/v6.6/driver-api/dmaengine/provider.html#dmaengine-controller-documentationDMA引擎控制器文档硬件介绍大多数从DMA控制器都具有相同的操作原则。它们具有一定数量的通道用于DMA传输,并具有一定数量的请求线。请求和通道基本上是正交的......
  • 谷歌地球引擎浏览器Google Earth Engine Explorer对栅格图像加以监督分类
      本文对谷歌地球引擎(GoogleEarthEngine,GEE)的网页界面式应用程序接口GoogleEarthEngineExplorer加以详细介绍,并基于其进行地物监督分类这一具体应用。本文是谷歌地球引擎(GoogleEarthEngine,GEE)系列教学文章的第一篇。  GoogleEarthEngineExplorer,简单来说就是将Googl......
  • 解决Docker启动Starting the Docker Engine的问题:
    问题如上图,试图启动Docker时一直转圈圈,已经确认了打开Hyper-V功能依然无法解决.通过在网上查资料,了解到因为在电脑上安装过了雷电模拟器等APK模拟器后,此时再去使用Docker就会出现奇奇怪怪的问题.因为系统只能虚拟化一个,无法都兼顾.解决方法1:重新启动Dokcer尝试重新......
  • Unreal入门,门06,道具随机生成与解锁
    1.在关卡蓝图中随机生成道具,并删除之前在关卡中手动放置的道具2.打开道具类型蓝图可编辑开关,随机生成不同道具3.在GameMode中增加函数判断道具是否集齐,并在TheDoor蓝图中解锁4.实时打印进度其它引擎版本为5.3.2参考https://neil3d.github.io/assets/p......
  • Unreal入门,门05,道具收集
    1.新建并应用基于BP_ThirdPersonGameMode的自定义GameMode2.在自定义GameMode中创建基于自定义枚举的容器,以及收集道具函数3.在道具蓝图中应用自定义GameMode中的自动收集函数其它引擎版本为5.3.2参考https://neil3d.github.io/assets/pdf/CUC-Week-......
  • sql-2.4+2.5数据库表的类型---engine
    CREATETABLE`student`(`id`intNOTNULLAUTO_INCREMENTCOMMENT'学号',`pwd`varchar(32)NOTNULLDEFAULT'123456'COMMENT'密码',`name`varchar(32)NOTNULLCOMMENT'名字',`address`varchar(60)NOTNULLCOMMENT......