虚幻引擎4:将渲染帧保存到内存中

时间:2015-11-05 20:54:14

标签: c++ unreal-engine4

以前,我希望将UE4呈现的帧输出到文件。

我成功完成了这项工作,详细信息可以在this StackOverflow post

中找到

将帧放到文件中的功能是:

 FScreenshotRequest::RequestScreenshot(filename, false, false);

现在,我想写入内存,而不是写入文件。我不想写入文件然后读入内存。

我一直在挖掘源代码,发现截图正在制作中,但遇到了一些麻烦。

ViewportClient->ProcessScreenShots(this);

1012行上调用

UnrealClient.cpp

之后,我发现屏幕截图实际上是在这里生成的:

bScreenshotSuccessful = GetViewportScreenShot(InViewport, Bitmap);

因此,在找到我认为需要的所有位后,我尝试在自定义Actor中重新创建它:

    UGameViewportClient* gameViewport = GEngine->GameViewport;
    FViewport* InViewport = gameViewport->Viewport;
    TArray<FColor> Bitmap;

    bool bScreenshotSuccessful = GetViewportScreenShot(InViewport, Bitmap);
    if (bScreenshotSuccessful){
        FIntVector Size(InViewport->GetSizeXY().X, InViewport->GetSizeXY().Y, 0);
        TArray<uint8> CompressedBitmap;
        FString ScreenShotName = TEXT("out.png");
        FImageUtils::CompressImageArray(Size.X, Size.Y, Bitmap, CompressedBitmap);
        FFileHelper::SaveArrayToFile(CompressedBitmap, *ScreenShotName);
    }

出于某种原因,bool bScreenshotSuccessful = GetViewportScreenShot(InViewport, Bitmap);会引发Access violation reading location 0x0000000000000020.例外。

我认为该错误与此行有关:

Viewport->ReadPixels(Bitmap, FReadSurfaceDataFlags(), ViewRect)

我对'访问违规'的内容进行了'googeling',看起来它与空指针或类似东西有关,但我仍然无法解决这个问题,因为我是相当新的c ++。

问题

如何解决此问题以使bScreenshotSuccessful成立?

注意:我意识到FFileHelper::SaveArrayToFile(CompressedBitmap, *ScreenShotName);尝试保存到文件,尽管我说这不是我想要做的,所以请忽略它,好像我有位图,我可以压缩和流式传输。

1 个答案:

答案 0 :(得分:1)

您的ViewRect只有三个点而不是四个,格式错误。试试这个片段:

FIntRect Rect(0, 0, InViewport->GetSizeXY().X, InViewport->GetSizeXY().Y);
bScreenshotSuccessful = GetViewportScreenShot(InViewport, Bitmap, Rect);