【发布时间】:2015-11-05 20:54:14
【问题描述】:
以前,我希望将 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)
我已经为“访问冲突”是什么而进行了“谷歌搜索”,它似乎与空指针或类似的东西有关,但我仍然无法弄清楚这一点,因为我是对 c++ 比较陌生。
问题
我怎样才能解决这个问题,使bScreenshotSuccessful 为真?
注意:我意识到FFileHelper::SaveArrayToFile(CompressedBitmap, *ScreenShotName); 尝试保存到文件,尽管我说这不是我想要做的,所以请忽略它,就像我有位图一样,我可以压缩并流式传输。
【问题讨论】:
标签: c++ unreal-engine4