Unreal中如何使用C++访问MediaTexture中的图像数据
Unreal Engine MediaTexture 像素数据获取方案
蓝图实现方案
适合低频、快速原型开发场景:
- 提前创建和MediaTexture分辨率一致的
Render Target资源 - 调用
Draw Material to Render Target节点,输入参数:- 目标Render Target:刚创建的中转RT
- 材质:绑定了MediaTexture的Unlit材质(或直接传入MediaTexture对应的默认材质)
- 调用
Read Render Target Pixels节点,直接输出FColor类型的像素数组
注意:该方案CPU-GPU同步开销较高,不要高频每帧调用
C++实现方案
方案1:Render Target中转(兼容所有版本,稳定性高)
核心逻辑和蓝图一致,性能略高于蓝图实现:
// 需提前引入头文件:#include "Kismet/GameplayStatics.h" UMediaTexture* MediaTex = /* 你的MediaTexture实例 */; UTextureRenderTarget2D* TempRT = /* 提前创建的分辨率匹配的RT */; // 绘制MediaTexture到RenderTarget UGameplayStatics::DrawMaterialToRenderTarget(GetWorld(), TempRT, MediaTex->GetMaterial()); // 读取像素到数组 TArray<FColor> PixelData; TempRT->GetColorData(PixelData);
方案2:直接读取RHI资源(性能最优,适合高频读取)
跳过Render Target中转,直接从MediaTexture的GPU资源读取数据,适合视频流逐帧处理场景:
// 需提前引入头文件 // #include "MediaTexture.h" // #include "RHI.h" // #include "Rendering/RenderingCommon.h" // #include "RHICommandList.h" if (!MediaTex || !MediaTex->Resource) return; FTexture2DRHIRef TexRHI = MediaTex->Resource->GetTexture2DRHI(); if (!TexRHI.IsValid()) return; int32 Width = TexRHI->GetSizeX(); int32 Height = TexRHI->GetSizeY(); TArray<FColor> PixelData; PixelData.SetNumUninitialized(Width * Height); // 向渲染线程提交读取指令 ENQUEUE_RENDER_COMMAND(ReadMediaTexData)( [TexRHI, Width, Height, &PixelData](FRHICommandListImmediate& RHICmdList) { RHICmdList.ReadSurfaceData( TexRHI, FIntRect(0, 0, Width, Height), PixelData, FReadSurfaceDataFlags() ); } ); // 同步等待渲染线程完成读取,非高频场景可直接用,高频场景建议改为异步回调避免阻塞游戏线程 FlushRenderingCommands();
注意:如果需要获取BGRA、YUV等其他格式的像素数据,可修改
FReadSurfaceDataFlags参数适配对应像素格式
内容的提问来源于stack exchange,提问作者vicky Lin
相关产品推荐
相关产品推荐

