【问题标题】:Unreal Engine 4: save rendered frame to memory虚幻引擎 4:将渲染帧保存到内存
【发布时间】:2015-11-05 20:54:14
【问题描述】:

以前,我希望将 UE4 渲染的帧输出到文件中。

我设法做到了,详情可以在this StackOverflow post中找到

将帧输出到文件的功能是:

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

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

我一直在挖掘源代码,找到了截屏的位置,但遇到了一些麻烦。

ViewportClient->ProcessScreenShots(this);1012UnrealClient.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)

我已经为“访问冲突”是什么而进行了“谷歌搜索”,它似乎与空指针或类似的东西有关,但我仍然无法弄清楚这一点,因为我是对 c++ 比较陌生。

问题

我怎样才能解决这个问题,使bScreenshotSuccessful 为真?

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

【问题讨论】:

    标签: c++ unreal-engine4


    【解决方案1】:

    您的 ViewRect 只有三个点而不是四个点,而且格式错误。试试这个 sn-p:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-03-06
      • 1970-01-01
      • 2018-06-29
      • 2020-07-24
      • 2015-02-04
      • 1970-01-01
      • 2015-01-13
      • 2015-07-03
      相关资源
      最近更新 更多