UE4_后期处理_后期处理材质四—场景物体描边
一、效果如下图:

二、分析:
回顾复习:在后期处理材质三中,我们通过计算开启自定义深度通道物体的像素点上下左右4个像素SceneTextureCustomDepth深度之和来判断物体的外部(包含物体的边)和内部,只有内部像素他的上下左右4个像素自定义深度之和才为有限值,边和外部都为无限大(这与没有自定义深度物体用无穷大填充有关),这样我们使用if语句就能判定它与无穷大的关系,从而让边和外部为描边颜色,内部为场景颜色。我们通过自定义模具得到物体外部为0内部为模具值的蒙版,这样我们可以用lerp节点,当为0时为场景色,而边和内部为上一步if语句的结果就可以了。
那么场景物体描边怎么来确定这个边呢?
边有什么特点呢?相信理解了场景深度、自定义深度和自定义模具知识的朋友们,会发现边的场景深度是不是悬殊很大?因为2个物体有间隔,所以两个物体的场景深度悬殊大,差值是不是很大?那么我们怎么得到这个差值呢?是不是边的上边像素减去边的下边像素是有很大的值?这能不能作为边的判定条件呢?
三、所涉知识点:
SceneTextureSceneDepth(场景深度)
场景深度图代表的意思是物体离摄像机越远数值就越大,离摄像机越近数字就越小越接近黑色 。测试如下图:


四、制作步骤:
1、当前像素的场景深度减去右下方像素的场景深度
根据我们的分析,如果我们把一张场景深度图减去偏移一个像素的深度图,那么在场景深度有断层的附近将会有数值相对较大的差值出现,我们就可以用这种方法得到场景的描边勾线 。
效果制作如下:

得到效果图如下:

画面有抖动,材质的可混合位置为色调映射前就解决这个问题了。

2、分析结果出现原因
上一步,我们运用之前偏移像素点的方法,以SceneTexelSize作为偏移单位,接着与保存UV各个像素点uv坐标的 ScreenPosition进行相加,然后输出给SceneTextureSceneDepth的UV来获得临近的场景深度,最后用原本的场景深度减去获得的结果,就得到了上面的结果。我会发现不是我们想要的结果。
从不同的角度去观察墙面会得到不同的效果,如下图:


为什么会出现这种情况呢?我们来分析一下:
先用场景深度图的变化来看看:


水平方向偏移50个场景文素单位后得到的图:


发现场景深度发生了移动,如果两者相减(调整下文素大小),会得到下图:


发现上图只是对左边的边就行了描边,而右边没有描边,文素大小不调整看看效果:

如果还是不理解我们可以用具体的数值进行解释:

这是右边,你会发现都是正的。下面看看左边的具体数值,都是负的,就是黑色的。

3、场景物体边缘判断
通过上面的操作我们得到了左边边缘的描边,要想得到右边就需要偏移方向相反,如果我们把它们加起来就得到了左右的边缘描边,如下图:


如果你对上面不理解,那么我们还是需要具体的数值来加深理解,如下图:


经过左右偏移相加之后,你会发现除了边缘为正的,其它都是为0或者为负的,也就是黑色。
同理,我们获得上下边缘的描边再加上去。




4、拓展与提高
(1)但是这个描边勾线还不是最精确的,因为当在同一平面的场景深度时,线框就没了。
为了得到更精确的描边勾线,我们可以用SceneTextureSceneNormal(场景法线),可以让细小的凹槽部分(面的朝向不同)也能有颜色上的差异,而颜色的差异也就是数值上的差异。


同样用上面的方法再制作一遍(这边直接复制修改SceneTexture的ID就好了),然后会得到一个法线版本的描边勾线(注意最后除的5000是为了观察效果的,得去掉,否则一片黑)。
效果图如下:

为了得到更全的描边效果,可以把两种方法的结果去最大值max,这样应该就不会遗漏未描的边。
(2)描边颜色该如何修改?
直接乘以一个颜色就可以了。
(3)遮罩范围内是真实的,另一边是线框的效果
就是用一个遮罩来判断使用场景纹理:postprocessinput0还是场景描边。这里需要用到一个蓝图节点spheremask,知识点如下:
SphereMask的参数
SphereMask有四个输入参数。
A:待检查的位置。
B:圆心的位置。
Radius:半径。
Hardness:硬度,0是完整过渡,100是没有过渡。
输出的是一个0~1之间的数。当A在B之外时,输出0,当A在B的位置时,输出1。A在园内时,输出0~1,具体取决于是否有硬度以及位置。
注意,A和B可以1~4维的vector。


我们可以在小白人蓝图中把小白人的位置传递给材质参数集中向量参数location,其为为B的输入,worldposition为A的输入,Radius为材质参数集中的标量参数,可以让它在3秒内,随着时间变化,让它作为Radius的输入。蓝图节点如下:
后期处理材质中:

小白人蓝图中:

材质参数集:

这样的话就有了动态的效果了。
(4)如何让角色周围是描边并添加遮罩的发光圈
首先我们需要在材质中得到角色的位置,可以通过材质参数集进行传递,步骤如下:
新建材质参数集,参数命名为locationVector:

小白人蓝图中实时给它传递值:

材质中使用:

效果如图:
(5)天空应该怎么摘出来?
天空没办法开启自定义深度通道,所以我们要尝试用SceneTextureSceneDepth(场景深度)求出,因为天空离摄像机最远,所以可以与某个比较大的数(比天空离摄像机的距离略小)进行对比的时候,只有天空的部分会比这个数大,我们就能得到天空的黑白遮罩蒙版了。测试材质连接如下:

效果如下图:

这样我们就得到了天空的蒙版,可以让天空显示原来的颜色,其它部分显示线框。

效果图如下:

五、参考教程:
https://zhuanlan.zhihu.com/p/87762783
UE4后期处理材质的一些应用(下) - 哔哩哔哩
【UE4】虚幻4使用后期处理制作的发光轮廓线效果_哔哩哔哩_bilibili
相关文章:
UE4_后期处理_后期处理材质四—场景物体描边
一、效果如下图: 二、分析: 回顾复习:在后期处理材质三中,我们通过计算开启自定义深度通道物体的像素点上下左右4个像素SceneTextureCustomDepth深度之和来判断物体的外部(包含物体的边)和内部,…...
华为OD机试 - 推荐多样性(Python/JS/C/C++ 2024 E卷 100分)
华为OD机试 2024E卷题库疯狂收录中,刷题点这里 专栏导读 本专栏收录于《华为OD机试真题(Python/JS/C/C)》。 刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,…...
梧桐数据库(WuTongDB):CBO(Cost-Based Optimizer)基于代价的优化器技术简介
CBO(基于代价的优化器,Cost-Based Optimizer)是现代数据库系统中最广泛使用的查询优化器之一。它通过计算执行查询时可能消耗的资源(如CPU、内存、I/O)来选择最优的执行计划,以提高查询性能。 1. CBO 的工…...
深入探索Go语言中的函数:匿名函数、指针参数与函数返回
1. Go语言中的函数 函数是任何编程语言中的核心元素,它们帮助我们将大型程序分解为更小的、易于管理的部分。在Go语言中,函数是通过 func 关键字定义的。理想的函数应当是独立的,完成单一任务。如果你发现某个函数正在执行多个任务ÿ…...
Android12_13左上角状态栏数字时间显示右移动
文章目录 问题场景解决问题 一、基础资料二、代码追踪三、解决方案布局的角度解决更改paddingStart 的默认值设置marginLeft 值 硬编码的角度解决 问题场景 1)早期一般屏幕都是方形的,但是曲面屏,比如:好多车机Android产品、魔镜…...
望繁信科技携流程智能解决方案亮相CNDS 2024新能源产业数智峰会
9月13日,CNDS 2024中国新能源产业数智峰会在北京圆满落幕。本次峰会以“走向数字新能源”为主题,汇聚了来自新能源领域的顶尖领袖、专家学者及知名企业代表,共同探讨数字化技术在新能源行业中的创新应用和发展趋势。上海望繁信科技有限公司&a…...
nginx负载均衡(轮询与权重)
文章目录 1. nginx的介绍2. nginx使用场景3. nginx在windows的下载与安装4. nginx的简单使用5. nginx进行轮询测试6. nginx进行权重测试7. 总结 1. nginx的介绍 Nginx(engine x)是一个高性能的HTTP和反向代理web服务器,同时也是一个开源的、…...
【计算机网络】网络通信中的端口号
文章目录 一、引入端口号二、端口号的作用三、端口号的确定 在TCP/IP协议中,传输层有两个重要的协议:TCP(传输控制协议)和UDP(用户数据报协议)。TCP用于提供可靠的数据传输,而UDP则适合用于广播…...
Python 解析 JSON 数据
1、有如下 JSON 数据,存放在 data.json 文件: [{"id":1, "name": "小王", "gender": "male", "score": 96.8}, {"id":2, "name": "小婷", "gender&qu…...
利用LlamaIndex构建ARG本地知识库
文章目录 1. 环境准备2. 启用诊断日志3. 配置本地模型4. 配置本地向量模型5. LlamaIndex全局配置6. 创建 PGVectorStore7. 从数据库加载数据8. 文本分割器: SpacyTextSplitter9. 配置管道10. 创建向量存储索引11 .指定响应模式,以及启用流式响应 在现代的人工智能应…...
PCM的缺点
PCM的主要缺点包括需要较大的数据传输带宽和存储空间,导致无法实现高压缩比,相对较低的数据压缩效率。 PCM(脉冲编码调制)作为一种无损编码技术,虽然能够保留原始信号的完整性,适用于需要高保…...
【C语言】(指针系列四)回调函数+qsort函数
一、回调函数 回调函数就是通过函数指针调用的函数 如果你把函数的指针作为参数传递给另外一个函数,当这个指针被用来调用其所指向的函数时,被调用的函数就是回调函数。回调函数并不是一个单一的函数实现的,而是在某种情况下,编…...
全面理解tensor编程中矩阵的行和列
经常会在编程中遇到理解矩阵行和列的事情。 1、要明确无论这个张量有多少维度,它的矩阵乘法都只能作用于最后两个维度。 例如: import torcha torch.rand([64, 32, 3, 4]) b torch.rand([64, 32, 3, 4])c torch.matmul(a, b.transpose(2, 3)) # 交…...
【Kubernetes】常见面试题汇总(十)
目录 29.简述 Kubernetes 自动扩容机制? 30.简述 Kubernetes Service 类型? 31.简述 Kubernetes Service 分发后端的策略? 32.简述 Kubernetes Headless Service ? 29.简述 Kubernetes 自动扩容机制? (…...
CSS —— 界面布局
flexbox - 弹性盒子布局(弹性布局) 一维方向,横纵向排列。 采用flex布局的元素,称为 Flex 容器(flex container),简称"容器" flex-direction 用于设置主轴方向;子元素默…...
SpringBoot万级并发-jemeter-Address already in use: connect
一、场景 用Jmeter压力单测接口的时候,发现报 Response code:Non HTTP response code: java.net.BindException Response message:Non HTTP response message: Address already in use: connect 然后我这边是wondows的电脑操作压测的,操作系统win10&…...
P1228 地毯填补问题
 #include<bits/stdc.h> using namespace std; #define qw dfs(zxl-1,zyl-1,zx,zy,l); #define we dfs(zxl-1,zyl,zx,zyl,l); #define er dfs(zxl,zyl-1,zxl,zy,l); #define rt dfs(zxl,zyl,zxl,zyl,l);void dfs(int x,int y,int zx,int zy,int…...
【计算机网络】UDP TCP介绍
UDP & TCP介绍 UDP报文格式报文内容介绍端口号报文长度校验和载荷 TCP报文格式初步了解TCP机制确认应答超时重传连接管理滑动窗口流量控制拥塞控制紧急传输数据推送延时应答捎带应答面向字节流异常处理心跳机制 UDP 和 TCP 的区别 UDP 报文格式 对于网络协议, 本质上就是…...
JDBC初相识
文章目录 JDBC的由来JDBC的好处 JDBC核心API的介绍JDBC会用到的包JDBC四个核心对象JDBC访问数据库的步骤 客户端操作MySQL数据库的方式 使用第三方客户端来访问MySQL:SQLyog、Navicat 使用MySQL自带的命令行方式 通过Java来访问MySQL数据库,今天要学习…...
Go语言现代web开发07 map字典
Maps are complex data types used to store key-value pairs. Each key can appear only once on the map and can be used to find the value paired with that key. The default value for the map is nil. A nil map has no keys and keys cannot be added. 映射是用于存储…...
浏览器访问 AWS ECS 上部署的 Docker 容器(监听 80 端口)
✅ 一、ECS 服务配置 Dockerfile 确保监听 80 端口 EXPOSE 80 CMD ["nginx", "-g", "daemon off;"]或 EXPOSE 80 CMD ["python3", "-m", "http.server", "80"]任务定义(Task Definition&…...
遍历 Map 类型集合的方法汇总
1 方法一 先用方法 keySet() 获取集合中的所有键。再通过 gey(key) 方法用对应键获取值 import java.util.HashMap; import java.util.Set;public class Test {public static void main(String[] args) {HashMap hashMap new HashMap();hashMap.put("语文",99);has…...
《从零掌握MIPI CSI-2: 协议精解与FPGA摄像头开发实战》-- CSI-2 协议详细解析 (一)
CSI-2 协议详细解析 (一) 1. CSI-2层定义(CSI-2 Layer Definitions) 分层结构 :CSI-2协议分为6层: 物理层(PHY Layer) : 定义电气特性、时钟机制和传输介质(导线&#…...
java调用dll出现unsatisfiedLinkError以及JNA和JNI的区别
UnsatisfiedLinkError 在对接硬件设备中,我们会遇到使用 java 调用 dll文件 的情况,此时大概率出现UnsatisfiedLinkError链接错误,原因可能有如下几种 类名错误包名错误方法名参数错误使用 JNI 协议调用,结果 dll 未实现 JNI 协…...
STM32标准库-DMA直接存储器存取
文章目录 一、DMA1.1简介1.2存储器映像1.3DMA框图1.4DMA基本结构1.5DMA请求1.6数据宽度与对齐1.7数据转运DMA1.8ADC扫描模式DMA 二、数据转运DMA2.1接线图2.2代码2.3相关API 一、DMA 1.1简介 DMA(Direct Memory Access)直接存储器存取 DMA可以提供外设…...
ElasticSearch搜索引擎之倒排索引及其底层算法
文章目录 一、搜索引擎1、什么是搜索引擎?2、搜索引擎的分类3、常用的搜索引擎4、搜索引擎的特点二、倒排索引1、简介2、为什么倒排索引不用B+树1.创建时间长,文件大。2.其次,树深,IO次数可怕。3.索引可能会失效。4.精准度差。三. 倒排索引四、算法1、Term Index的算法2、 …...
土地利用/土地覆盖遥感解译与基于CLUE模型未来变化情景预测;从基础到高级,涵盖ArcGIS数据处理、ENVI遥感解译与CLUE模型情景模拟等
🔍 土地利用/土地覆盖数据是生态、环境和气象等诸多领域模型的关键输入参数。通过遥感影像解译技术,可以精准获取历史或当前任何一个区域的土地利用/土地覆盖情况。这些数据不仅能够用于评估区域生态环境的变化趋势,还能有效评价重大生态工程…...
C# SqlSugar:依赖注入与仓储模式实践
C# SqlSugar:依赖注入与仓储模式实践 在 C# 的应用开发中,数据库操作是必不可少的环节。为了让数据访问层更加简洁、高效且易于维护,许多开发者会选择成熟的 ORM(对象关系映射)框架,SqlSugar 就是其中备受…...
云原生玩法三问:构建自定义开发环境
云原生玩法三问:构建自定义开发环境 引言 临时运维一个古董项目,无文档,无环境,无交接人,俗称三无。 运行设备的环境老,本地环境版本高,ssh不过去。正好最近对 腾讯出品的云原生 cnb 感兴趣&…...
Golang——9、反射和文件操作
反射和文件操作 1、反射1.1、reflect.TypeOf()获取任意值的类型对象1.2、reflect.ValueOf()1.3、结构体反射 2、文件操作2.1、os.Open()打开文件2.2、方式一:使用Read()读取文件2.3、方式二:bufio读取文件2.4、方式三:os.ReadFile读取2.5、写…...
