之前,我希望将 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/