SceneCaptureComponent GetViewState return NULL then Capture Picture PostProcessing was being disabled.
I changed the source codes to
FSceneViewStateInterface* USceneCaptureComponent::GetViewState()
{
FSceneViewStateInterface* ViewStateInterface = ViewState.GetReference();
if (ViewStateInterface == NULL)
{
ViewState.Allocate();
ViewStateInterface = ViewState.GetReference();
}
return ViewStateInterface;
}
Then postprocessing in the newly captured picture becomes normal.
I don’t know why GetViewState should return NULL when bCaptureEveryFrame is set to false.
If theres is not a specific reason, I think it should always return a Valid ViewState. Then postprocessing in the captured picture can be turned on.
FSceneRenderer* FScene::CreateSceneRenderer( USceneCaptureComponent* SceneCaptureComponent, UTextureRenderTarget* TextureTarget, const FMatrix& ViewRotationMatrix, 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,
SceneCaptureComponent->ShowFlags)
.SetResolveScene(!bCaptureSceneColour));
FSceneViewInitOptions ViewInitOptions;
ViewInitOptions.SetViewRectangle(FIntRect(0, 0, CaptureSize.X, CaptureSize.Y));
ViewInitOptions.ViewFamily = &ViewFamily;
ViewInitOptions.ViewOrigin = ViewLocation;
ViewInitOptions.ViewRotationMatrix = ViewRotationMatrix;
ViewInitOptions.BackgroundColor = FLinearColor::Black;
ViewInitOptions.OverrideFarClippingPlaneDistance = MaxViewDistance;
ViewInitOptions.SceneViewStateInterface = SceneCaptureComponent->GetViewState();
.....................................................................................
FSceneView::FSceneView(const FSceneViewInitOptions& InitOptions)
: Family(InitOptions.ViewFamily)
, State(InitOptions.SceneViewStateInterface)
.................................................................................................................
.........................................................................................
if(State)
{
State->OnStartPostProcessing(*this);
}
.........................................................................................
And many PostProcessing Codes need ViewState to be valid to work.