FSceneRenderer* FScene::CreateSceneRenderer( USceneCaptureComponent* SceneCaptureComponent, UTextureRenderTarget* TextureTarget, const FMatrix& ViewMatrix, const FVector& ViewLocation, float FOV, float MaxViewDistance, bool bCaptureSceneColour, FPostProcessSettings* PostProcessSettings, float PostProcessBlendWeight ) { FIntPoint CaptureSize(TextureTarget->GetSurfaceWidth(), TextureTarget->GetSurfaceHeight()); FTextureRenderTargetResource* Resource = TextureTarget->GameThread_GetRenderTargetResource(); FSceneViewFamilyContext ViewFamily(FSceneViewFamily::ConstructionValues( Resource, this, FEngineShowFlags(ESFIM_Game)) .SetResolveScene(!bCaptureSceneColour)); // Disable features that are not desired when capturing the scene ViewFamily.EngineShowFlags.MotionBlur = 0; // motion blur doesn't work correctly with scene captures. ViewFamily.EngineShowFlags.SeparateTranslucency = 0; ViewFamily.EngineShowFlags.HMDDistortion = 0; FSceneViewInitOptions ViewInitOptions; ViewInitOptions.SetViewRectangle(FIntRect(0, 0, CaptureSize.X, CaptureSize.Y)); ViewInitOptions.ViewFamily = &ViewFamily; ViewInitOptions.ViewMatrix = ViewMatrix; ViewInitOptions.BackgroundColor = FLinearColor::Black; ViewInitOptions.OverrideFarClippingPlaneDistance = MaxViewDistance; if (bCaptureSceneColour) { ViewFamily.EngineShowFlags.PostProcessing = 0; ViewInitOptions.OverlayColor = FLinearColor::Black; } // Build projection matrix { float XAxisMultiplier; float YAxisMultiplier; if (CaptureSize.X > CaptureSize.Y) { // if the viewport is wider than it is tall XAxisMultiplier = 1.0f; YAxisMultiplier = CaptureSize.X / (float)CaptureSize.Y; } else { // if the viewport is taller than it is wide XAxisMultiplier = CaptureSize.Y / (float)CaptureSize.X; YAxisMultiplier = 1.0f; } ViewInitOptions.ProjectionMatrix = FReversedZPerspectiveMatrix ( FOV, FOV, XAxisMultiplier, YAxisMultiplier, GNearClippingPlane, GNearClippingPlane ); } FSceneView* View = new FSceneView(ViewInitOptions); View->bIsSceneCapture = true; check(SceneCaptureComponent); for (auto It = SceneCaptureComponent->HiddenComponents.CreateConstIterator(); It; ++It) { // If the primitive component was destroyed, the weak pointer will return NULL. UPrimitiveComponent* PrimitiveComponent = It->Get(); if (PrimitiveComponent) { View->HiddenPrimitives.Add(PrimitiveComponent->ComponentId); } } ViewFamily.Views.Add(View); View->StartFinalPostprocessSettings(ViewLocation); if (!bCaptureSceneColour) { View->OverridePostProcessSettings(*PostProcessSettings, PostProcessBlendWeight); } View->EndFinalPostprocessSettings(); return FSceneRenderer::CreateSceneRenderer(&ViewFamily, NULL); }
virtual void OverridePostProcessSettings(FSceneView& View) override { View.OverridePostProcessSettings(PostProcessSettings, PostProcessSettingsWeight); }