2017-12-14 2 views
0

저는 C++을 처음 사용합니다. C# 및 PHP로 코드를 작성했습니다. 언리얼 엔진을 사용하고 있으므로 C++을 배우려고합니다. 내 프로젝트의 경우 게임 내 스크린 샷을 만들어 즉시 표시해야하므로 텍스처로 사용하고 싶습니다.언리얼 엔진 C++ 위임 작성 OnScreenshotCaptured

"스크린 샷을 읽을 수 있습니다 : 나는 RequestScreenshot 위에 내 마우스를 가져 가면

void UMyBlueprintFunctionLibrary::TakeScreenshot() 
{ 
    FScreenshotRequest::RequestScreenshot(true); 

    if (GEngine) 
     GEngine->AddOnScreenDebugMessage(-1, 15.0f, FColor::Red, "Tried to take screenshot"); 
} 

내가 팝업 다음을 참조하십시오

나는 내가이 만든이 함수를 호출하는 청사진 노드를 만든 viewsport OnScreenshopCaptured 대표 "

에 가입하여 메모리 그래서 내가 수행하려고 할 것입니다하지만이 고개를 내가 어떻게 아무 생각이 : https://docs.unrealengine.com/latest/INT/API/Runtime/Engine/Engine/UGameViewportClient/OnScreenshotCaptured/

누군가가 이것을 어떻게 구현하는지, 어떻게 구현 하는지를 알 수 있습니까?

답변

0

나는 대리자가 없지만 자신이 구현 한 UGameViewportClient (상속)을 구현하고 Draw() 기능을 재정 의하여 할당 한 일부 버퍼에 FRenderTarget::ReadPixel()을 할당했습니다.

필수 코드가 표시되지만 완료되지는 않습니다.

void UMyGameViewportClient::Draw(FViewport* Viewport, FCanvas* SceneCanvas) 
{ 
    Super::Draw(Viewport, SceneCanvas); 
    if (any_condition_you_need) { 
     CaptureFrame(); 
    } 
} 

void UMyGameViewportClient::CaptureFrame() 
{ 
    if (!Viewport) { 
     return; 
    } 

    if (ViewportSize.X == 0 || ViewportSize.Y == 0) { 
     return; 
    } 

    ColorBuffer.Empty(); // Declare this in header as TArray<FColor> 

    if (!Viewport->ReadPixels(ColorBuffer, FReadSurfaceDataFlags(), 
          FIntRect(0, 0, ViewportSize.X, ViewportSize.Y))) 
    { 
     return; 
    } 
    SaveThumbnailImage(); 
} 

void UMyGameViewportClient::SaveThumbnailImage() 
{ 
    IImageWrapperModule& wrappermodule = FModuleManager::LoadModuleChecked<IImageWrapperModule>(FName("ImageWrapper")); 
    auto wrapper_ptr = wrappermodule.CreateImageWrapper(EImageFormat::PNG); 
    for (int i = 0; i < ColorBuffer.Num(); i++) 
    { 
     auto ptr = &ColorBuffer[i]; 
     auto r = ptr->R; 
     auto b = ptr->B; 
     ptr->R = b; 
     ptr->B = r; 
     ptr->A = 255; 
    } // not necessary, if you like bgra, just change the following function argument to ERGBFormat::BGRA 
    wrapper_ptr->SetRaw(&ColorBuffer[0], ColorBuffer.Num() * 4, 
     ViewportSize.X, ViewportSize.Y, ERGBFormat::RGBA, 8); 
    FFileHelper::SaveArrayToFile(wrapper_ptr->GetCompressed(), *ThumbnailFile); 
} 
+0

감사합니다. 잠시 후 다시 살펴 보겠습니다. – Smokegun

+0

흠 나는 정말로 대의원에게 설명해야합니다. – Smokegun

관련 문제