生活小妙招之UE CaptureRT改

发布于:2024-12-19 ⋅ 阅读:(8) ⋅ 点赞:(0)

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

一般的想法是四个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我滴神。


网站公告

今日签到

点亮在社区的每一天
去签到