生活小妙招之UE CaptureRT改

ops/2024/12/19 15:40:48/

需求,四个不同的相机拍摄结果同屏分屏显示

一般的想法是四个Capture拍四张RT,然后最后在面片/UI上组合。这样的开销是创建4张RT,材质中采样4次RT。

以更省的角度,想要对以上流程做优化,4个相机拍摄是必须的,目标是4个相机拍的RT结果存到1张RT中的4个区域,只创建1张RT,材质中也只采样1次RT。

UE原生带的RT相关的功能都无法满足我们想要的目标,目标是Capture拍到的RT中就已经分块处理好了,所以需要简单改造下Capture,下面举下简单的思路

下以Mobile Capture2D流程为例,代码流程还是很清晰的,主要看以下地方

调用渲染线程的UpdateSceneCaptureContent_RenderThread()

UpdateSceneCaptureContentMobile_RenderThread中SceneRenderer->Render正常画了场景,然后在CopyCaptureToTarget中可以看到用到的GlobalShader和对应的usf

那么到这里就有俩种修改思路了,我们现在想要的是一张RT中存四张图。

那么想法一就是4个Capture,每个绘制的结果采样InTexture时Remap相应的UV缩放到对应的边角,并且要计算相应的mask将其他区域干黑,最后利用CompositeMode的Additive叠加出最终的RT。

这里也有需要注意的地方,首先可以截帧看一下CaptureRenderScene中BasePass存来的Intexture是一张大图,不是CaptureRT设置的尺寸是多少就是多少。所以原本的流程中UE是获取了RT和Intexture的Size加入采样UV的计算的。我们自己如果要用方案一的做法的话,要添加自己额外的UVRemap的计算,并且mask的计算得加在PS中,加上这个功能我们得在Capture组件上加开关控制,usf里面还得加宏控制,虽然可以实现,但是这些计算其实是非必要的

那么想法二就是限制capture绘制RT时的绘制范围,也就是最终绘制的这里,保证单个Capture绘制的区域就限制在1/4块中,其他区域是没有写入的。这样就无需在Shader中添加额外的计算,是相对更合理的方案

代码相关的修改结束后我们能get到这样一张RT结果,剩下在材质中就是对UV做相应的Remap计算了,分屏切割相关的计算我这用到了

判断点在直线哪一侧的方法_判断一个点在直线的哪一侧-CSDN博客

我这自己实现的切割点是要动态变化的,如果是静态分屏的话,可以在外部算好一张线性UV贴图传入采样。还有直接RemapUV,分屏里的图显示范围是跟着框走的,如果要类似图固定在背景,计算时要加上相应的bias,这就不展开了

四个相机,一张RT,UI上K点小动效,齐活,PGR我滴神。


http://www.ppmy.cn/ops/143213.html

相关文章

Spring Mvc面试题(常见)

1 Spring MVC的执行流程 用户发起请求,请求先被Servlet拦截以后,转发给SpringMVC框架SpringMVC 里面的DispatcherServlet(核心控制器) 接收到请求,并转发给HandlerMappingHandlerMapping负责解析请求,根据请求信息和配置信息找到匹配的Controller类(当这里有配置拦截器,会…

Vue Web开发(十)

1. 用户管理新增,搜索,编辑,删除 本节课完成用户列表表单设计,使用table组件,同样模块化组件,CommonTable.vue组件,并且在User页面中引入,mock实现数据模拟,最终完成用户…

golang操作sqlite3加速本地结构化数据查询

目录 摘要Sqlite3SQLite 命令SQLite 语法SQLite 数据类型列亲和类型——优先选择机制 SQLite 创建数据库SQLite 附加数据库SQLite 分离数据库 SQLite 创建表SQLite 删除表 SQLite Insert 语句SQLite Select 语句SQLite 运算符SQLite 算术运算符SQLite 比较运算符SQLite 逻辑运算…

基于单片机的蔬菜大棚环境监测系统

本设计以单片机作为主控,通过温湿度检测模块监测、二氧化碳浓度采集模块、光照强度监测大棚中的环境数据,可以通过按键模块设置阈值,当超过阈值后将通过声光报警模块提示人们此时环境并不适合作物生长,并将以上监测数据通过液晶显…

C# WinForm移除非法字符的输入框

C# WinForm移除非法字符的输入框 文章目录 namespace System.Windows.Forms {using System.ComponentModel;/// <summary>/// 支持移除 非法字符 的输入框。/// </summary>public class RemoveInvalidCharTextBox : TextBox{/// <summary>/// 测试代码&#…

MongoDB集群中的一个典型的错误

1.案例 &#xff08;1&#xff09;现象&#xff1a;主备节点中&#xff0c;发生了切换&#xff0c;且原来的主节点mongo服务宕掉&#xff0c;且不能重新启动&#xff0c;检查了是不是防火墙和网路导致的&#xff0c;结果不是。 &#xff08;2&#xff09;从日志来看&#xff0…

Golang学习笔记_13——数组

Golang学习笔记_10——Switch Golang学习笔记_11——指针 Golang学习笔记_12——结构体 文章目录 数组1. 定义2. 访问和修改3. 多维数组4. 计算数组长度5. 数组作为函数参数6. 遍历7. 数组的内存表示 源码 数组 Go语言中的数组是一种具有固定长度、相同类型元素的集合。数组的…

如何快速打出 0 - 9 这10个数字

如何快速打出 0 - 9 这10个数字 提出问题原因 大家可能都听说过金山打字通, 就是打字的软件, 上面只教26个字母的盲打&#xff0c;当我们需要按下数字键时&#xff0c;往往需要看键盘&#xff0c;这样浪费了时间和效率。盲按的话&#xff0c;手够不着数字键&#xff0c;也不能…