2015-11-05 2 views
1

Раньше я искал вывод кадров, отображаемых UE4 в файл.Unreal Engine 4: сохранение выделенного кадра в память

мне удалось это сделать, и детали могут быть найдены в this StackOverflow post

Функция, чтобы из положить рамку в файле:

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

Теперь, вместо того, чтобы писать в файл, я хотел бы для записи в память. Я не хочу писать в файл, а затем читать в памяти.

Я искал исходный код и обнаружил, где сделаны скриншоты, но у меня проблемы.

ViewportClient->ProcessScreenShots(this); вызывается на линии 1012 из UnrealClient.cpp

После этого, я обнаружил, что скриншот фактически генерируется здесь:

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); бросок s a Access violation reading location 0x0000000000000020. исключение.

Я думаю, что ошибка имеет что-то делать с этой линией:

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

Я трейд «googeling» за что такое «Нарушение прав доступа» есть, и кажется, что это что-то делать с нулем указатель или что-то в этом роде, но я все еще не могу понять это, поскольку я довольно новичок в C++.

Вопрос

Как я могу это исправить, так что bScreenshotSuccessful верно?

ПРИМЕЧАНИЕ: Я понимаю, что FFileHelper::SaveArrayToFile(CompressedBitmap, *ScreenShotName); попытки сохранить файл, несмотря на мне, говоря, что это не то, что я хочу сделать, поэтому не обращайте внимания, что, как будто у меня есть растровое изображение, я могу сжать и поток.

ответ

1

У вас есть ViewRect всего три точки вместо четырех и в неправильном формате. Попробуйте этот фрагмент:

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