c++ - 虚幻引擎4 : save rendered frame to memory

标签 c++ unreal-engine4

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

我成功做到了这一点,详细信息可以在 this StackOverflow post 中找到。

将帧输出到文件的函数是:

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

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

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

ViewportClient->ProcessScreenShots(this); 正在 UnrealClient.cpp

1012 行调用

接下来,我发现截图实际上是在这里生成的:

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); 抛出 访问冲突读取位置 0x0000000000000020. 异常。

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

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

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

问题

如何修复此问题以使 bScreenshotSuccessful 为 true?

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

最佳答案

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

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

关于c++ - 虚幻引擎4 : save rendered frame to memory,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33554586/

相关文章:

c++ - 如何借助QT中的任何API设置系统亮度?

python - 从线程调用PyObject_Call导致堆栈溢出

c++ - 如何获得项目中所有 UClass 的列表(蓝图和 C++)

c++ - 执行 rapidjson 的 Document 对象的拷贝

c++ - 为什么 std::memcpy 的行为对于不是 TriviallyCopyable 的对象是未定义的?

c++ - 为什么指针分配的内存在函数之后仍然存在,而不是数组?

c++ - 从鼠标位置数学设置 Actor 世界位置

collision-detection - UE4 Mesh 多个碰撞点检测

unreal-engine4 - 如何调试虚幻引擎源代码

c++ - 如何在 C++ 中添加非标准库?