2015-11-05 83 views
1

以前,我一直在尋找將UE4渲染的幀輸出到文件。虛幻引擎4:將渲染幀保存到內存

我成功地做到這一點,並在細節可以在this StackOverflow post

被發現了把框架文件的功能是:

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

現在,而不是寫入文件,我想寫入內存。我不想寫入文件然後讀入內存。

我一直在挖掘源代碼,發現截圖正在製作中,但遇到了一些麻煩。

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

1012線在此之後,我發現,實際上正在這裏生成的截圖:

bScreenshotSuccessful = GetViewportScreenShot(InViewport, Bitmap); 

所以,發現我想我需要的所有位之後,我試圖在一個自定義演員中重新創建它:

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); throw是一個Access violation reading location 0x0000000000000020.異常。

我認爲錯誤有事情做這一行:

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

我已經TREID「googeling」什麼的「訪問衝突」是,似乎這是值得做的一個空指針或類似的東西,但我仍然無法弄清楚,因爲我對C++很陌生。

問題

我怎樣才能解決這個問題,使bScreenshotSuccessful是真的嗎?

注意:我知道,那FFileHelper::SaveArrayToFile(CompressedBitmap, *ScreenShotName);嘗試將其保存到文件中,儘管我說,是不是我想做的事,所以請忽略,如果我有位圖,我可以壓縮和流呢。

回答

1

您只有三個點而不是四個格式錯誤的ViewRect。試試這個片段:

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