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

news2024/11/13 12:03:57

一、效果:

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

参考:

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.coloradmin.cn/o/2115941.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数据结构与算法学习day20-二叉树的最大深度、最小深度、完全二叉树的节点个数、平衡二叉树、二叉树所有路径

一、二叉树的最大深度 1.题目 104. 二叉树的最大深度 - 力扣&#xff08;LeetCode&#xff09; 2.思路 2.1递归法 二叉树节点的深度&#xff1a;指从根节点到该节点的最长简单路径边的条数或者节点数&#xff08;取决于深度从0开始还是从1开始&#xff09;二叉树节点的高度…

安卓玩机工具------vivo机型线刷救砖固件 下载工具操作步骤预览

vivo机型玩机 vivo机型虽然对于玩家来说相对可玩性较低。官方封闭bl锁。对于普通玩家来说只能 中规中矩使用机型。但目前有很多vivo机型通过第三方渠道已经可以解bl锁和root操作。但有时候玩机会遇到误操作或者其他系统性问题导致系统瘫痪不开机。 那么我们就需要具备一些救砖…

Linux网络——Socket编程函数

一.网络命令 1.ping ping命令用来检测网络是否连通&#xff0c;具体用法为&#xff1a; ping 任意网址 结果如下&#xff1a; 当出现上述字段时&#xff0c;证明网络是连通的&#xff0c;这里值得注意的是&#xff0c;ping命令执行之后会不断进行网络检测&#xff0c;不会停…

Linux——网络基础Socket编程

目录 一计算机网络背景 二协议 1初始协议 1.1协议分层 1.2OSI七层模型 1.3TCP/IP五层模型 2再始协议 2.1为什么要有TCP/IP协议 2.2TCP/IP与OS的关系 2.3所以什么是协议 三网络传输基本流程 1局域网&#xff08;以太网&#xff09;通信原理 1.1认识mac地址 2同…

【软件设计师真题】下午题第一大题---数据流图设计

解答数据流图的题目关键在于细心。 考试时一定要仔细阅读题目说明和给出的流程图。另外&#xff0c;解题时要懂得将说明和流程图进行对照&#xff0c;将父图和子图进行对照&#xff0c;切忌按照常识来猜测。同时应按照一定顺序考虑问题&#xff0c;以防遗漏&#xff0c;比如可以…

综合案例-数据可视化-地图

一、pyecharts—地图快速入门 假设我们要将6个地区的某种数量在地图上标注出来&#xff0c;首先导入pyecharts包内地图相关模块&#xff0c;然后准备地图数据&#xff08;数据类型是列表&#xff0c;列表的元素类型为元组&#xff09;&#xff0c;然后把准备好的数据添加进地图…

Java笔试面试题AI答之单元测试JUnit(1)

文章目录 1. 什么是JUnit&#xff1f;2. JUnit的重要特征是什么&#xff1f;3. 什么是单元测试案例&#xff1f;单元测试的特点&#xff1a;单元测试的好处&#xff1a;编写单元测试案例的步骤&#xff1a; 4. 何时在开发周期中编写单元测试&#xff1f;5. 为什么不直接使用Sys…

【鸿蒙开发从0到1 day07】

ArkTS-基础语法 一.开发环境1.下载Dev Eco Stdio2.下载chinese插件3.基础入门4.输出语句5.注释 二.3种常见的数据类型1.数据类型2.储存数据(1)变量:专门用来存储数据的容器(可变)(2)常量(3)命名规则 三.数组四.函数1.无参函数2.有参函数3.返回值4.箭头函数 五.对象六.总结 一.开…

HBuilderx中vue页面引用scss样式

scss为css样式的预编译器&#xff0c;引入了变量、嵌入、混合、集成、引入等功能&#xff0c;相对于css样式&#xff0c;实现了样式的编程&#xff0c;具有更灵活的样式编写模式。 那么在HBuilderx中&#xff0c;“.vue”格式页面如何调用scss样式呢&#xff1f;详细如下&#…

每日一练7:简写单词(含链接)

1.链接 简写单词_牛客题霸_牛客网 2.题目 3.代码1&#xff08;错误经验&#xff09; #include <iostream> #include <string> using namespace std;int main() {string s;string ret;int count 0;while(cin >> s)for(auto a : s){if(count 0){if( a <…

字符串操作的高效工具—正则表达式

字符串操作的高效工具—正则表达式 一 . 概述1.1 认识正则表达式1.2 正则表达式体验案例 二 . 使用2.1 字符类2.2 逻辑运算符2.3 预定义字符2.4 数量词2.5 分组括号2.6 字符串中常用含有正则表达式的方法 正则表达式&#xff08;Regular Expression&#xff0c;简称 regex 或 r…

xcode打包报错之 zip fail / copy fail

在xcode中archive打包中&#xff0c;遇到提示zip fail或者copy fail&#xff0c;此时请清理你电脑的缓存文件了&#xff0c;但凡遇到这两种报错&#xff0c;是编译时运行内存不够导致的&#xff0c;请及时查看并清理你的电脑。 如下&#xff1a; 将对应的缓存或者垃圾清理&am…

春日美食汇:基于SpringBoot的订餐平台

2 系统关键技术 2.1JSP技术 JSP(Java脚本页面)是Sun和许多参与建立的公司所提倡的动态web技术。将Java程序添加到传统的web页面HTML文件()。htm,。Html) [1]。 JSP这种能够独立使用的编程语言可以嵌入在html语言里面运行&#xff0c;正因为JSP参照了许多编程语言的特性&#xf…

C++——类与对象(二)

目录 引言 类的默认成员函数 构造函数 1.构造函数的概念 2.注意事项 初始化列表 1.初始化列表的概念 2.注意事项 析构函数 1.析构函数的概念 2.注意事项 拷贝构造函数 1.拷贝构造函数的概念 2.注意事项 运算符重载 1.运算符重载的概念 2.注意事项 赋值运算符…

食家巷桃酥:一口酥脆,回味悠长

在众多的传统糕点中&#xff0c;食家巷桃酥以其独特的魅力脱颖而出&#xff0c;成为了许多人心中的美味记忆。初见食家巷桃酥&#xff0c;那金黄的色泽便让人食欲大增。每一块桃酥都像是一件小小的艺术品&#xff0c;散发着诱人的香气。它的外形饱满&#xff0c;边缘微微隆起&a…

JVM 调优篇1 类的加载器与加载过程

一 基本知识 1.1 JIT&AOT JIT: Just Time compilation 即时编译器 在程序运行时将字节码或中间表示转换为机器代码。 AOT: Ahead of Tmie Compilation &#xff1a; 预编译 在程序运行之前将高级语言代码完全编译成机器代码。 1.2 字面量和符号引用* 字面量&am…

安卓下载工具箱_3.8.1/去浏览器跳转登录就是会员

下载工具箱app是一款支持56种下载协议的安卓万能下载工具,下载工具箱最新版主要提供网络视频解析下载,资源嗅探下载,以及本地视频扫描提取功能,同时提供不常见的视频编辑功能,例如:智能清洗,高帧率/码率等 链接: https://pan.baidu.com/s/1pW0CgmGv9bmzGkBA4rV2oQ?pwdxdby …

群晖NAS安装alist

官方文档&#xff1a;https://alist.nn.ci/zh NAS参考&#xff1a;https://post.smzdm.com/p/an9zpvev/ Windows安装&#xff1a;alist-windows-amd64.zip 手机参考&#xff1a;https://studylessshape.github.io/post/note/alist-install-for-android/ 质感文件可以不用安&…

Science|癌症中三级淋巴结构的免疫调节作用与治疗潜力|顶刊精析·24-09-08

小罗碎碎念 Science文献精析 今天精析的这一篇综述&#xff0c;于2022-01-07发表于Science&#xff0c;主要讨论了癌症中的三级淋巴结构&#xff08;Tertiary Lymphoid Structures, TLS&#xff09;及其在肿瘤免疫反应中的作用。 作者类型作者姓名单位名称&#xff08;中文&…

前端学习笔记-Web APls篇-04

Dom节点&移动端滑动 1.日期对象 日期对象:用来表示时间的对象作用:可以得到当前系统时间 1.1实例化 在代码中发现了 new 关键字时&#xff0c;一般将这个操作称为实例化 创建一个时间对象并获取时间 获得当前时间 获得指定时间 1.2时间对象方法 使用场景&#xff1a…