ue4 截图总结

1 获取rendertarget数据

        // ReadPixelsAsync stats:
        // FPS:     ~30fps
        // Frame:   ~30ms
        ReadPixelsAsync();
        
        // ReadPixels stats:
        // FPS:     ~24fps
        // Frame:   ~40ms
        //        ReadPixels();
        
void ACapturePawn::ReadPixels() {
    
    
    // Get texture render target pixel data
    FRenderTarget* RenderTarget =
    CaptureComponent->TextureTarget->GameThread_GetRenderTargetResource();
    FReadSurfaceDataFlags ReadSurfaceDataFlags;
    RenderTarget->ReadPixels (
                              PixelData,
                              ReadSurfaceDataFlags,
                              FIntRect (0, 0, FrameWidth, FrameHeight));
    
    bWaitingOnPixelData = true;
    bPixelDataReady = true;
}

void ACapturePawn::ReadPixelsAsync() {
    
    
    
    //    GEngine->AddOnScreenDebugMessage(-1, 5.f, FColor::Green, TEXT("ReadPixelsAsync Begin"));
    
    FRenderTarget* RenderTarget =
    CaptureComponent->TextureTarget->GameThread_GetRenderTargetResource();
    FIntRect InRect(0, 0, RenderTarget->GetSizeXY().X, RenderTarget->GetSizeXY().Y);
    
    PixelData.Empty(RenderTarget->GetSizeXY().X * RenderTarget->GetSizeXY().Y);
    PixelData.Reset();
    FReadSurfaceDataFlags InFlags(RCM_UNorm, CubeFace_MAX);
    
    // Read the render target surface data back.
    struct FReadSurfaceContext
    {
    
    
        FRenderTarget* SrcRenderTarget;
        TArray<FColor>* OutData;
        FIntRect Rect;
        FReadSurfaceDataFlags Flags;
        bool* bFinishedPtr;
    };
    
    FReadSurfaceContext ReadSurfaceContext =
    {
    
    
        RenderTarget,
        &PixelData,
        InRect,
        InFlags,
        &bPixelDataReady
    };
    
    ENQUEUE_UNIQUE_RENDER_COMMAND_ONEPARAMETER(
                                               ReadSurfaceCommand,
                                               FReadSurfaceContext, Context, ReadSurfaceContext,
                                               {
    
    
                                                   RHICmdList.ReadSurfaceData(
                                                                              Context.SrcRenderTarget->GetRenderTargetTexture(),
                                                                              Context.Rect,
                                                                              *Context.OutData,
                                                                              Context.Flags
                                                                              );
                                                   
                                                   *Context.bFinishedPtr = true;
                                               }
                                               );
    
    //    GEngine->AddOnScreenDebugMessage(-1, 5.f, FColor::Green, TEXT("ReadPixelsAsync Finish"));
    
    bWaitingOnPixelData = true;
}

2 获取backbuffer
在editer里面 会获取整个窗口

如果想获取单独游戏画面 需要打包或者单独窗口
此块代码可以参考 pixel streaming插件

3 获取Fviewport

代码参考 UMediaCapture::CaptureSceneViewport 里面逻辑

在PlayInEditorViewportActive模式下 viewport无法输出widget上的东西
在si’mulate下面 获取不到viewport

单独窗口和打包和backbuffer效果一样

猜你喜欢

转载自blog.csdn.net/chao56789/article/details/114932685