轮廓是在 3D 环境中突出显示对象的绝佳工具。到目前为止,我尝试过的大多数 Unreal 解决方案都是基于后处理 (PP) 技术来实现对象轮廓的。对我来说,PP 解决方案在行为和外观方面一直是最有效的。就个人而言,我最常使用Tom Looman的多色轮廓(和对象突出显示)方法。

不幸的是,PP 的问题在于它的成本,这对手机和笔记本电脑影响很大。如果你在做 VR,节省 PP 成本肯定也是一个好主意。

关于虚幻中 PP 轮廓的一些琐碎事实(此列表肯定不完整):

  • 最初,可以使用自定义深度缓冲区来在 PP 中生成轮廓。不幸的是,没有办法(据我所知)在 PP 中仅基于自定义深度来区分对象。这将轮廓限制为仅一种颜色(例如,无法区分对象)。
    随着虚幻引擎中自定义模板缓冲区的引入,可以创建多色轮廓,因为该缓冲区允许通过为对象分配模板值来区分对象。
  • 作为 PP 中生成的轮廓,很难根据虚拟环境中发生的情况创建自定义效果。这是因为大多数信息在 PP 域中不可用,和/或在那里获取它是困难和不方便的。
  • 即使你不显示轮廓或具有轮廓的对象,PP 仍然会在你的环境中增加其成本。

最近,Tom Looman 在他的网站上提到了一种无需使用 PP 即可实现轮廓的解决方案。基于他提供的信息,我给出了自己的实现,这适合我正在从事的项目。它的主要限制是我没有添加模糊效果来使轮廓 “更温和”。此外,这些轮廓实际上存在于你的环境中,因此它们会影响它(例如考虑反射捕获或类似的)。

2、逐网格轮廓技术

PP 轮廓材料使用 Sobel 边缘检测器以及基于用例的一些其他滤波器来计算轮廓。滤波处理的结果是一个“蒙版”,其中包含将着色的像素,以便在屏幕上获得轮廓。这种技术的想法是将轮廓材质从 PP 移动到基于每个对象应用的材质。

实际上,新的 Outline 材质将应用于我们要勾勒的网格周围的网格。这个外部网格上,除了绘制轮廓所需的像素之外其他所有像素都是透明的。

为了做到这一点,建议的解决方案使用了一个 Actor 组件,它可以添加到我们想要勾勒的 Actor 中。

一旦 Begin Play 触发,组件将

  • 检索在其Owner找到的所有静态网格(我们称它们为原始网格)
  • 创建它们的副本(我们将这些副本称为外部网格)。
  • 稍微放大它们,以便每个外部网格包含自己的原始网格(当前为 1.3 因子比例)
  • 为外部网格指定轮廓材质。
  • 使原始网格在自定义深度缓冲区上渲染。此步骤是必需的,因为轮廓材质将在自定义深度缓冲区上执行轮廓提取。

下图显示:

  1. 外部网格及其原始网格。
  2. 包围其原始网格的外部网格。
  3. 真实的设置,带有轮廓的对象。

上面图像用于说明外部网格的形状和比例,前两张图片中的缩放比例被夸大了以突出差异。

轮廓组件还提供了显示/隐藏大纲以及更改其颜色的工具。该工具目前在蓝图中实现,但我计划制作 C++ 版本并将其添加到 Magic Utilities 插件中。

3、轮廓材料

轮廓材质使用材质函数从自定义深度缓冲区中提取轮廓。材质函数看起来不太好,如果可能的话,我想用自定义节点或不同的实现来替换它。无论如何,有趣的是,一个自定义节点执行完全相同的操作可能不如当前材质函数优化,因为虚幻引擎优化了材质节点,但可能跳过了自定义节点内部代码的优化。

材质本身是相当基本的,产生一个简单的、非平滑/模糊的轮廓:

4、轮廓描边示例

最后,这里是一些工作实现的图片:

单个对象上的轮廓示例,单色

轮廓示例,在多个对象上,每个对象都有自己的颜色。

同样,多个对象,具有较粗的轮廓。

轮廓不是后期处理的,因此可以定制效果


原文链接:UE4轮廓描边轻量实现 — BimAnt

UE4轮廓描边【非后处理】相关推荐

  1. 【UE4_001】后期处理轮廓描边效果

    简介 通过材质计算得到物体边缘,通过后期处理的方式对物体边缘进行描边显示 ue4 材质描边.外发光.轮廓线_哔哩哔哩_bilibili Unreal Engine 4 卡通轮廓线(Toon Outli ...

  2. 实现游戏中的轮廓描边

    Unity3D教程:实现游戏中的轮廓描边.Unity3D游戏中常用到轮廓描边,效果就是对轮廓描边后再进行模糊处理.有两种思路可以实现: 一.在RTT中绘制单一像素,对1绘制后的RTT进行blur处理惩 ...

  3. 轮廓波-非下采样轮廓波NSCT

    轮廓波-非下采样轮廓波NSCT 1.定义 a) NSCT变换主要由两部分组成: ① 尺度分解的非下采样金字塔滤波器组(Non Subsampled Pyramid Filter Bank,NSPFB) ...

  4. UE4模型轮廓描边及轮廓发光

    参考自:https://zhuanlan.zhihu.com/p/81310476 1.在项目设置里把Custom Depath-Stencil Pass改为Enabled with Stencil, ...

  5. [unreal4入门系列之十二] 在UE4中创建非玩家角色(NPC)

    现在我们来创建一些NPC(non-playable characters,非玩家角色).在这个游戏中,当我们靠近NPC时,它们会做出相应的反应. 创建C++类 1) 在UE编辑器中,打开文件-新建C+ ...

  6. UE4 Socket多线程非阻塞通信【1】

    昨日不可追, 今日尤可为.勤奋,炽诚,不忘初心 前面写了一篇有关于虚幻4加载第三方库的博客思前顾后,感觉细节还是有必要拎起来注意下. ue4自带的Fsocket用起来依旧不是那么的顺手,感觉超出了我的 ...

  7. Unity 2D图片外轮廓描边和内发光的Shader实现

    很长时间没有写博客了,一方面Sebastian大佬正在更新程序生成星球的教程,所以想等到大佬更新接近尾声的时候开始那个教程的分享.最近主要是在工作之余补一补Unityshader的基础知识,然后正好在 ...

  8. UE4 Socket多线程非阻塞通信【2】

    昨日不可追, 今日尤可为.勤奋,炽诚,不忘初心 紧接着第一部分,别说话,勿打断我游离的思绪我们走我们走... 二.消息结构&收发队列 先不急着往下走,先捋一捋,不知道自己要干什么地走下去是一件 ...

  9. 国内首篇利用freetype的跨平台truetype字体真正轮廓(非位图)获取

    转载自:https://blog.csdn.net/tianyuan521521/article/details/46273407 前言 最近在做一款激光打标控制的产品,我的思路是将所有的图元矢量化, ...

最新文章

  1. decimal.Round 的区别
  2. Java 性能优化实战记录(3)--JVM OOM的分析和原因追查
  3. C#资源文件与与资源名称字符串之间的互相转化
  4. nacos集群之日志狂刷fail to connect server,after trying 567 times,last try server is...
  5. Python入门——石头剪刀布程序
  6. 【Linux】一步一步学Linux——mktemp命令(263)
  7. 用VS Code打造最佳Markdown编辑器
  8. Linux文件的复制、删除和移动命
  9. 如何做一个国产数据库(三)
  10. 超高薪的机器学习工程师和现在的前后端们有什么不同?
  11. Android碎碎念 -- 广播LocalBroadcastManager的实现
  12. android fresco 存储,Android使用Fresco之下载图片(包括GIF图)
  13. C在mac上用不了malloc.h头文件的解决方法
  14. Resin服务器配置指南
  15. kubernetes挂载glusterfs遇到的问题
  16. 判断二极管导通例题_从120分到140分:高考数学解答题五大答题策略
  17. PPT修改尺寸(修改幻灯片大小)
  18. python模块 - 常用模块推荐
  19. 【UE4】联网游戏开发的正确姿势
  20. 修改MacOSX 启动菜单中磁盘名称

热门文章

  1. CComObject 。。。(转)
  2. c51单片机汇编语言语法错误,关于c51单片机交通灯汇编程序怎么加一个紧急状态按键的问题...
  3. 如何在页面上呈现谷歌地图
  4. 汽车门阈值防抱死系统abs
  5. 【ZJOJ 5454】【NOIP2017提高A组冲刺11.5】仔细的检查
  6. 【算法】高精度计算π(pi)值
  7. 彻底搞懂javascript中的replace函数
  8. Mybatis-1.Mybatis概述
  9. 为什么Java的图标是一杯咖啡呢?
  10. 2年java开发工作经验