UE4_后期处理_后期处理材质及后期处理体积三—遮挡物体描边显示

一、效果:

在很多游戏中为了玩家能看到墙面背后是否有敌人,会给被遮挡的敌人增加描边显示,效果如下:

参考:

https://zhuanlan.zhihu.com/p/81310476

https://zhuanlan.zhihu.com/p/358140547

二、所需知识

知识点梳理

1、PixelDepth 像素深度

当前被渲染的这个像素点与摄像机的距离。该节点没有输入接口,说明这个节点不能够获取特定位置的深度,只能获取像素着色器目前处理的这个像素点。

最基础的深度概念,我们说起深度时默认指的就是PixelDepth。

2、SceneDepth 场景深度

场景深度,当前场景的深度信息映射到屏幕上的一张图,从输入值有UV这一点来看就知道它是基于屏幕UV且可以获取非当前像素深度的。比较经常用在屏幕后处理里面。

3、CustomDepth 自定义深度

通过SceneTexture节点获取,用在屏幕后处理中,只需要在指定的物体上开启“渲染自定义深度通道”即“Render Custom Depth”,该物体的PixelDepth就会被渲染到一张单独的Buffer中。

这张Buffer是一张与SceneDepth很相似的Buffer,不同的地方在于它将没有开启CustomDepth的区域扣掉了,用一个极大的值去填充(10^8),得到了一张只有CustomDepth区域有效的Buffer。

假设场景中只有一个物体开启了自定义深度,整个场景的自定义深度应该是这样的:

4、CustomStencil/CustomDepthStencil 自定义模具/自定义深度模具

不要被它称呼中带有的Depth迷惑了(血泪教训),它根本不是深度值,而是一个模板值,这个模板值就是在细节面板设置的一个1-255的整数值,从个人的使用体验来讲它就像是一个图层的标识,可以将物体分类处理。

各蓝图节点之间的区别:

PixelDepth VS SceneDepth

SceneDepth很好理解,就是一张写入了屏幕上每一个像素距离摄像机的距离的图片,可以找到很多示例,注意深度值一般要除以3000左右的数值来使深度值在0-1范围内才能直接输出到材质的BaseColor节点上测试。

而PixelDepth不是一张图,只是一个点而已,它对其他像素的深度一无所知。

SceneDepth VS CustomDepth、

就是把不需要的地方涂掉,看图就比较好理解了。

CustomDepth VS CustomStencil

假设图中三个物体都被开启了在CustomDepth通道中渲染,并且设置了不同的模板值,那么在材质里就可以获取它们的模板值并且分别处理。

说明

在视口左上角的视图模式可以在缓冲显示的子菜单里找到CustomDepth和CustomStencil的可视化,可以通过这个菜单检查自定义深度和模具开启情况和具体数值。注意在ES3.1情况下是看不到缓冲可视化的,记得关闭ES3.1再进行检查。

启用CustomDepth需要在项目设置-Rendering-Postprocessing中启用自定义深度-模具通道

这里深度和模具是分开开启的,“已启用”选项意味着只启用深度而禁用模具,需要注意有一下,如果设置了模板、能够看到自定义深度,却看不到模板可视化图像,可以检查一下项目设置。(以模具开启)。

三、分析

要找到物体的边缘边界,假设这是场景的自定义深度图,每一格是一个像素,里面存放着各个像素点的自定义深度值 

我们看到的物体内部是蓝色数值,红色的就是我们需要的边,正无穷就是没有开启自定义深度的物体外部

判定物体的边有很多种方法,我们要先搞清楚以下几点:

 a.物体的内部:可以获取到自定义深度的数值,上下左右4个像素点都可以获取自定义深度

       b.物体的边缘:可以获取到自定义深度的数值,上下左右4个像素点不全都能获取到自定义深度

       c.物体的外部:自定义深度的数值为正无穷,上下左右4个像素点不全都能获取到自定义深度

       通过上述规律,我们可以用这种方法确定物体的边界:当一个像素点自身的自定义深度值不为正无穷,但上下左右四个像素点的和却为正无穷时,这个像素点就是物体的边(UE4中没有正无穷,所以用一个很大的数来近似判定是否为正无穷)

       而在UE4中SceneTextureCustomDepth(自定义深度)就是用来输出这张图的 。效果验证图如下:

但是直接连接的话由于数值都大于1,所以都显示为白色,需要除以一个很大的数来把数值控制在0-1之间才能正确显示我们需要的结果

       

四、步骤:

了解了原理后,我们开始制作描边效果。

1、创建后期材质

创建一个新的材质球,在参数中修改为后期处理与色调映射前 

2、添加屏幕位置ScreenPosition节点

屏幕uv是这样的,先创建一个ScreenPosition(屏幕位置)节点,ScreenPosition的原点在屏幕左上角。

ScreenPosition蓝图节点的ViewportUV引脚输出的是每个像素点在屏幕上的UV值(2维数组),取值范围是0~1,等于是每个像素点的UV都获取一次,然后进行处理,连接到自发光可以看到,横坐标为R值纵坐标为G值,右上角为(1,0)显示红色,左下角为(0,1)显示绿色,右下角为(1,1)显示黄色(红+绿为黄色) 

ScreenPosition蓝图节点的PixelPosition引脚输出的是每个像素点在屏幕上的位置坐标,取值范围是0~屏幕尺寸,直接连接到自发光可以看到画面偏亮,但不是纯白色 

而当我们把这个值除以1000后,画面的颜色与ViewportUV接近 

3、理解SceneTexelSize场景纹素大小并使用

我们再创建一个SceneTexelSize(场景纹素大小),这也是一个2维数组的值,对应着UV(u,v),uv均为正数,这里u就代表着要在横向偏移一个像素单位需要增加或者减少多少,v也同理

       比如你的屏幕是1920*1080的,那么你屏幕的横向上就有1920个像素,U的取值区间是0~1,那么横向上每个像素就占1/1920≈0.000521,同理纵向上每个像素就占1/1080≈0.000926,那么SceneTexelSize的值就为(0.000521,0.000926)。

  举个例子,比如现在有个像素点的uv为(0.2,0.6),那么这个像素上方的像素点则为

(0.2,0.6-0.000926),下方则为(0.2,0.6+0.000926),左右同理(因为UE4中uv坐标系原点在左上角,所以这里向上为减,向下为加)

       上述的结论可以由PixelPosition与SceneTexelSize相乘得到的结果验证 

SceneTexture:PostProcessInput0(后期处理输入0)节点:这个节点其实就是SceneColor(场景本来的颜色),而SceneColor只能用于材质域为Surface(表面)的材质,所以这里用的是SceneTexture:后期处理输入0 

观察场景没有变化。

理解了这些节点之后,我们就可以通过这些节点来计算出各个自定义深度像素点的上下左右4个像素点之和了。如下图所示:

 4、判断上下左右四个深度之和是否是无穷大

然后我们再把算出来的和跟一个近似无穷大的数作比较,如果大于近似无穷大的数则为自定义模具物体的边与外部,给它一个颜色值(这里我用了黄色),如果小于近似无穷大的数则为自定义模具物体内部,给它场景原本的颜色 。蓝图节点如下图:

5、使用后期材质观察效果

(一定要注意蓝图节点输出数据的维数):

6、使用自定义模具作为选区使用

从上面结果上看,我们现在已把开启自定义深度的物体外部和物体边缘显示了黄色,物体内部显示了本来颜色,现在我们需要把物体外部排除掉,让它也显示原本的颜色(自定义模具正好能够得到这么个选区)。

实现的蓝图节点如下图:

注意:项目设置中不要忘了以模具开启:

得到的效果如下:

7、添加遮挡判断

现在的结果是比较接近目的了,但是我们需要的是被挡住的才能显示,所以还得加上判断:

通过上面的区别我们知道了customDepth与scenedepth的区别,通过下图,我们能更加直观的区分开:

SceneDepth(场景深度):当前画面上的像素点和摄像机之间的距离,这是从你看得到的地方开始算的,比如摄像机镜头正对着一面墙,墙后有个自定义深度的立方体,那么获取到的场景深度就是黑色虚线的长度(墙到摄像机之间的距离),跟立方体无关。

       CustomDepth(自定义深度):想获得被遮挡的物体离相机的距离,要开启物体上的自定义深度通道,如果在UV对应的像素点方向上有物体开启了自定义深度,即使被遮挡也可以获取到它的场景深度。如果该位置没有物体开启自定义深度,那么得到的值则是无穷大。

       所以我们就可以根据自定义深度(绿色虚线)和场景深度(黑色虚线)的差值来判断是否有东西被遮挡住(如果有两个开启了自定义深度通道的物体在一条线上的话,那么获取到的CustomDepth是离摄像机更近的那个)。

CustomDepth-SceneDepth的差

       (1)如果开启CustomDepth被挡住,那么CustomDepth>SceneDepth,CustomDepth-SceneDepth=有限值

       (2)如果开启CustomDepth没被挡住,那么CustomDepth=SceneDepth=0

       (3)如果没有开启CustomDepth,那么CustomDepth-SceneDepth=无穷大

       结论:

当<=0时,也就是物体没有被遮挡,那么用原本的颜色即SceneTexture后期处理输入0的Color值;

当0<差值<9999999时,说明物体开启了自定义深度并且被挡住了,输出之前得到的描边;

当>9999999时,也就是为正无穷,说明没有物体开启自定义深度通道,也是用原本的颜色。

但是由于上一步中我们已经用SceneTexture自定义模具判断是否开启自定义深度通道了,所以我们下一步只需要判断是否遮挡就可以了:

8、效果如图:

  五、拓展

1、亮度分层

现在完全达到了我们需要的效果,只有遮挡的部分会显示描边,但是在上一章中我们知道了,当我们调整自定义深度模具值后,亮度会变化,因为自定义模具只是返回一个数值就是模具值,开具自定义深度并有模具值的才显示这个颜色灰阶,其它显示黑色,这会使效果更佳有趣,可是如果我们不需要亮度增加的话,我们设置自定义深度模具值为1就可以。

2、描边宽度

可以添加一个Width参数,这个参数与SceneTexelSize相乘,就可以调节描边的粗细了,就是通过改变偏移的像素数量来控制描边粗细。蓝图节点如下:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/417858.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java笔试面试题AI答之JDBC(3)

文章目录 13. 编写JDBC连Oracle的程序?14. 简述JDBC的主要组件有哪些 &#xff1f;15. JDBC中如何防止SQL注入攻击&#xff1f;1. 使用预处理语句&#xff08;PreparedStatement&#xff09;2. 避免在SQL查询中直接拼接用户输入的数据总结 16. JDBC的脏读是什么&#xff1f;哪…

Spring01——Spring简介、Spring Framework架构、Spring核心概念、IOC入门案例、DI入门案例

为什么要学 spring技术是JavaEE开发必备技能&#xff0c;企业开发技术选型命中率>90%专业角度 简化开发&#xff1a;降低企业开发的复杂度框架整合&#xff1a;高效整合其他技术&#xff0c;提高开发与运行效率 学什么 简化开发 IOCAOP 事务处理 框架整合 MyBatis 怎…

深度学习的基础_多层感知机的手动实现

多层感知机&#xff08;Multilayer Perceptron&#xff0c;简称MLP&#xff09;是一种前馈人工神经网络。它包含至少三层节点&#xff1a;一个输入层、一个或多个隐藏层以及一个输出层。除输入节点外&#xff0c;每个节点都是一个带有非线性激活函数的神经元&#xff08;或称为…

Word快速重复上一步操作的三种高效方法

在日常工作、学习和生活中&#xff0c;我们经常需要执行一系列重复性的操作。这些操作可能简单如复制粘贴、调整图片大小&#xff0c;也可能复杂如编辑文档、处理数据等。为了提高效率&#xff0c;掌握快速重复上一步操作的方法显得尤为重要。本文将介绍三种高效的方法&#xf…

给力!Python配置文件,这一篇就够了!

在开发过程中&#xff0c;我们常常会用到一些固定参数或者是常量。对于这些较为固定且常用到的部分&#xff0c;往往会将其写到一个固定文件中&#xff0c;避免在不同的模块代码中重复出现从而保持核心代码整洁。 这里插播一条粉丝福利&#xff0c;如果你在学习Python或者有计划…

【C题成品论文已出】24数学建模国赛C题成品论文(附参考代码)免费分享

24高教社杯数学建模国赛C题成品论文 一、问题一模型建立与求解 1.1模型建立 &#xff08;1&#xff09;决策变量设计 表示一个26158的矩阵&#xff0c;其中26是平旱地梯田和山坡地的总数&#xff0c;15是在这几类土地上可以种植的农作物数量&#xff0c;8则表示从2023到203…

KCP实现原理探析

KCP 是一个轻量级的、高效的、面向 UDP 的传输协议库&#xff0c;专为需要低延迟和高可靠性的实时应用设计。本文针对 KCP 的主要机制和实现与原理进行分析。 1. 术语 术语 全称 说明 TCP Transmission Control Protocol 传输控制协议 RTT Round Trip Time 往返时延 …

【鸿蒙HarmonyOS NEXT】调用后台接口及List组件渲染

【鸿蒙HarmonyOS NEXT】调用后台接口及List组件渲染 一、环境说明二、调用后台接口及List组件渲染三、总结 一、环境说明 DevEco Studio 版本&#xff1a; API版本&#xff1a;以12为主 二、调用后台接口及List组件渲染 后台接口及返回数据分析 JSON数据格式如下&#xf…

Git创建项目

方法一 1.在gitee中新建仓库demo01&#xff0c;并勾选开源许可证&#xff0c;完成后gitee上面的项目demo01里只包含一个LICENSE文件 2.直接在本地电脑中新建项目文件夹demo01&#xff0c;双击进入这个文件夹&#xff0c;右键Git bash here&#xff0c;输入 git clone https:…

跨域问题(CORS)

文章目录 介绍解决一、添加跨域头&#xff0c;允许跨域1.后端配置CORS策略(4种方法)2.配置nginx 二、代理 介绍 跨域资源共享&#xff08;CORS, Cross-Origin Resource Sharing&#xff09;是浏览器的一个安全机制&#xff0c;用来防止来自一个域的网页对另一个域下的资源进行…

Linux操作系统在虚拟机VM上的安装【CentOS版本】

目录 准备工作 "CPU虚拟化"的方法 VMware的安装 Linux镜像文件的下载 开始安装 声明 新建虚拟机 安装CentOS7.6 配置Linux(CentOS7.6)操作系统 配置分区【学习者可以直接点击自动配置分区&#xff0c;不过还是建议学习一下手动分区】 分区原则 添加分区 …

提示工程颠覆:DSPy 引领全新范式革命

几个月前,我清楚地记得,Prompt Engineering 还是热门话题。就业市场上充斥着提示工程师的岗位,仿佛这是未来的必备技能。 然而,现在情况已经大不相同了。提示工程并不是一门艺术或科学,更像是“聪明的汉斯”现象——人类为系统提供了必要的背景,以便系统能更好地作出回应…

Maven聚合与继承

聚合 当我们一次想要构建多个项目时&#xff0c;而不是到每一个模块的目录下分别执行mvn命令。这个时候就需要使用到maven的聚合特性 这里第一个特殊的地方是packaging&#xff0c;值设置为pom。我们正常开发的其他模块中都没有声明packaging&#xff0c;默认使用了默认值jar&a…

【Qt】仿照qq界面的设计

widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QDebug>//QT中信息调试类&#xff0c;用于输出数据&#xff0c;无需使用该类的实例化对象&#xff0c;直接使用成员函数即可 #include <QIcon>//图标类 #include <QPushButton&…

代码随想录——回文子串(Leetcode 647)

题目链接 我的题解&#xff08;双指针&#xff09; 思路&#xff1a; 当然&#xff0c;以下是对您提供的代码的解释&#xff1a; class Solution {public int countSubstrings(String s) {// 初始化回文子字符串的数量int count 0;// 遍历字符串的每个字符&#xff0c;使用…

综合评价 | 基于熵权-变异系数-博弈组合法的综合评价模型(Matlab)

目录 效果一览基本介绍程序设计参考资料 效果一览 基本介绍 根据信息熵的定义&#xff0c;对于某项指标&#xff0c;可以用熵值来判断某个指标的离散程度&#xff0c;其信息熵值越小&#xff0c;指标的离散程度越大&#xff0c; 该指标对综合评价的影响&#xff08;即权重&…

基于鸿道Intewell操作系统的运动控制系统方案

随着工业控制行业的蓬勃发展&#xff0c;操作系统实时与非实时业务的深度融合应用需求日益增长&#xff0c;特别是在Windows或Linux平台上处理机器视觉等复杂场景时&#xff0c;传统实时操作系统&#xff08;RTOS&#xff09;面临显著挑战。这些挑战主要体现在两方面&#xff1…

欢迎体验 tuya open-sdk for arduino

我们很高兴地宣布 tuya open-sdk 1.0.0 发布&#xff0c;tuya open-sdk 包括&#xff1a;https://github.com/tuya/tuya-open-sdk-for-device 和 https://github.com/tuya/arduino-tuyaopen 等多个系列&#xff0c;1.1.0 版本正在紧张开发中&#xff0c;敬请期待&#xff01; …

视频监控系统布局策略:EasyCVR视频汇聚平台构建高效、全面的安全防线

随着科技的飞速发展&#xff0c;视频监控系统已成为现代社会安全防范的重要组成部分&#xff0c;广泛应用于公共场所、企业园区、住宅小区等各个领域。一个科学合理的视频监控系统布局与选型策略&#xff0c;不仅能够显著提升安全监控的效率和效果&#xff0c;还能在关键时刻提…

DNN学习平台(GoogleNet、SSD、FastRCNN、Yolov3)

DNN学习平台&#xff08;GoogleNet、SSD、FastRCNN、Yolov3&#xff09; 前言相关介绍1&#xff0c;登录界面&#xff1a;2&#xff0c;主界面&#xff1a;3&#xff0c;部分功能演示如下&#xff08;1&#xff09;识别网络图片&#xff08;2&#xff09;GoogleNet分类&#xf…