You've already forked UnrealEngineUWP
mirror of
https://github.com/izzy2lost/UnrealEngineUWP.git
synced 2026-03-26 18:15:20 -07:00
Renderpass updates.
Planar reflections. Self-contained. #jira UERNDR-292 #rb none [CL 4534288 by Matt Collins in Dev-Rendering branch]
This commit is contained in:
@@ -129,50 +129,51 @@ void PrefilterPlanarReflection(FRHICommandListImmediate& RHICmdList, FViewInfo&
|
||||
// Workaround for a possible driver bug on S7 Adreno, missing planar reflections
|
||||
ERenderTargetLoadAction RTLoadAction = IsVulkanMobilePlatform(View.GetShaderPlatform()) ? ERenderTargetLoadAction::EClear : ERenderTargetLoadAction::ENoAction;
|
||||
|
||||
FRHIRenderTargetView ColorView(Target->GetRenderTargetTexture(), 0, -1, RTLoadAction, ERenderTargetStoreAction::EStore);
|
||||
FRHISetRenderTargetsInfo Info(1, &ColorView, FRHIDepthRenderTargetView());
|
||||
RHICmdList.SetRenderTargetsAndClear(Info);
|
||||
|
||||
RHICmdList.SetViewport(View.ViewRect.Min.X, View.ViewRect.Min.Y, 0.0f, View.ViewRect.Max.X, View.ViewRect.Max.Y, 1.0f);
|
||||
|
||||
FGraphicsPipelineStateInitializer GraphicsPSOInit;
|
||||
RHICmdList.ApplyCachedRenderTargets(GraphicsPSOInit);
|
||||
GraphicsPSOInit.BlendState = TStaticBlendState<>::GetRHI();
|
||||
GraphicsPSOInit.RasterizerState = TStaticRasterizerState<FM_Solid, CM_None>::GetRHI();
|
||||
GraphicsPSOInit.DepthStencilState = TStaticDepthStencilState<false, CF_Always>::GetRHI();
|
||||
|
||||
TShaderMapRef<TDeferredLightVS<false> > VertexShader(View.ShaderMap);
|
||||
TShaderMapRef<FPrefilterPlanarReflectionPS<bEnablePlanarReflectionPrefilter> > PixelShader(View.ShaderMap);
|
||||
|
||||
GraphicsPSOInit.BoundShaderState.VertexDeclarationRHI = GFilterVertexDeclaration.VertexDeclarationRHI;
|
||||
GraphicsPSOInit.BoundShaderState.VertexShaderRHI = GETSAFERHISHADER_VERTEX(*VertexShader);
|
||||
GraphicsPSOInit.BoundShaderState.PixelShaderRHI = GETSAFERHISHADER_PIXEL(*PixelShader);
|
||||
GraphicsPSOInit.PrimitiveType = PT_TriangleList;
|
||||
|
||||
SetGraphicsPipelineState(RHICmdList, GraphicsPSOInit);
|
||||
|
||||
PixelShader->SetParameters(RHICmdList, View, ReflectionSceneProxy, SceneColorInput, View.ViewRect.Width());
|
||||
VertexShader->SetSimpleLightParameters(RHICmdList, View, FSphere(0));
|
||||
|
||||
FIntPoint UV = View.ViewRect.Min;
|
||||
FIntPoint UVSize = View.ViewRect.Size();
|
||||
|
||||
if (RHINeedsToSwitchVerticalAxis(GShaderPlatformForFeatureLevel[View.FeatureLevel]) && !IsMobileHDR())
|
||||
FRHIRenderPassInfo RPInfo(Target->GetRenderTargetTexture(), MakeRenderTargetActions(RTLoadAction, ERenderTargetStoreAction::EStore));
|
||||
RHICmdList.BeginRenderPass(RPInfo, TEXT("PrefilterPlanarReflections"));
|
||||
{
|
||||
UV.Y = UV.Y + UVSize.Y;
|
||||
UVSize.Y = -UVSize.Y;
|
||||
}
|
||||
RHICmdList.SetViewport(View.ViewRect.Min.X, View.ViewRect.Min.Y, 0.0f, View.ViewRect.Max.X, View.ViewRect.Max.Y, 1.0f);
|
||||
|
||||
DrawRectangle(
|
||||
RHICmdList,
|
||||
0, 0,
|
||||
View.ViewRect.Width(), View.ViewRect.Height(),
|
||||
UV.X, UV.Y,
|
||||
UVSize.X, UVSize.Y,
|
||||
View.ViewRect.Size(),
|
||||
FSceneRenderTargets::Get(RHICmdList).GetBufferSizeXY(),
|
||||
*VertexShader,
|
||||
EDRF_UseTriangleOptimization);
|
||||
FGraphicsPipelineStateInitializer GraphicsPSOInit;
|
||||
RHICmdList.ApplyCachedRenderTargets(GraphicsPSOInit);
|
||||
GraphicsPSOInit.BlendState = TStaticBlendState<>::GetRHI();
|
||||
GraphicsPSOInit.RasterizerState = TStaticRasterizerState<FM_Solid, CM_None>::GetRHI();
|
||||
GraphicsPSOInit.DepthStencilState = TStaticDepthStencilState<false, CF_Always>::GetRHI();
|
||||
|
||||
TShaderMapRef<TDeferredLightVS<false> > VertexShader(View.ShaderMap);
|
||||
TShaderMapRef<FPrefilterPlanarReflectionPS<bEnablePlanarReflectionPrefilter> > PixelShader(View.ShaderMap);
|
||||
|
||||
GraphicsPSOInit.BoundShaderState.VertexDeclarationRHI = GFilterVertexDeclaration.VertexDeclarationRHI;
|
||||
GraphicsPSOInit.BoundShaderState.VertexShaderRHI = GETSAFERHISHADER_VERTEX(*VertexShader);
|
||||
GraphicsPSOInit.BoundShaderState.PixelShaderRHI = GETSAFERHISHADER_PIXEL(*PixelShader);
|
||||
GraphicsPSOInit.PrimitiveType = PT_TriangleList;
|
||||
|
||||
SetGraphicsPipelineState(RHICmdList, GraphicsPSOInit);
|
||||
|
||||
PixelShader->SetParameters(RHICmdList, View, ReflectionSceneProxy, SceneColorInput, View.ViewRect.Width());
|
||||
VertexShader->SetSimpleLightParameters(RHICmdList, View, FSphere(0));
|
||||
|
||||
FIntPoint UV = View.ViewRect.Min;
|
||||
FIntPoint UVSize = View.ViewRect.Size();
|
||||
|
||||
if (RHINeedsToSwitchVerticalAxis(GShaderPlatformForFeatureLevel[View.FeatureLevel]) && !IsMobileHDR())
|
||||
{
|
||||
UV.Y = UV.Y + UVSize.Y;
|
||||
UVSize.Y = -UVSize.Y;
|
||||
}
|
||||
|
||||
DrawRectangle(
|
||||
RHICmdList,
|
||||
0, 0,
|
||||
View.ViewRect.Width(), View.ViewRect.Height(),
|
||||
UV.X, UV.Y,
|
||||
UVSize.X, UVSize.Y,
|
||||
View.ViewRect.Size(),
|
||||
FSceneRenderTargets::Get(RHICmdList).GetBufferSizeXY(),
|
||||
*VertexShader,
|
||||
EDRF_UseTriangleOptimization);
|
||||
}
|
||||
RHICmdList.EndRenderPass();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -582,6 +583,7 @@ IMPLEMENT_SHADER_TYPE(,FPlanarReflectionPS,TEXT("/Engine/Private/PlanarReflectio
|
||||
|
||||
bool FDeferredShadingSceneRenderer::RenderDeferredPlanarReflections(FRHICommandListImmediate& RHICmdList, const FViewInfo& View, bool bLightAccumulationIsInUse, TRefCountPtr<IPooledRenderTarget>& Output)
|
||||
{
|
||||
check(RHICmdList.IsOutsideRenderPass());
|
||||
// Prevent rendering unsupported views when ViewIndex >= GMaxPlanarReflectionViews
|
||||
// Planar reflections in those views will fallback to other reflection methods
|
||||
{
|
||||
@@ -632,61 +634,63 @@ bool FDeferredShadingSceneRenderer::RenderDeferredPlanarReflections(FRHICommandL
|
||||
}
|
||||
}
|
||||
|
||||
SetRenderTarget(RHICmdList, Output->GetRenderTargetItem().TargetableTexture, nullptr);
|
||||
|
||||
if (!bSSRAsInput)
|
||||
FRHIRenderPassInfo RPInfo(Output->GetRenderTargetItem().TargetableTexture, ERenderTargetActions::Load_Store);
|
||||
RHICmdList.BeginRenderPass(RPInfo, TEXT("DeferredPlanarReflections"));
|
||||
{
|
||||
DrawClearQuad(RHICmdList, FLinearColor(0, 0, 0, 0));
|
||||
}
|
||||
|
||||
{
|
||||
RHICmdList.SetViewport(View.ViewRect.Min.X, View.ViewRect.Min.Y, 0.0f, View.ViewRect.Max.X, View.ViewRect.Max.Y, 1.0f);
|
||||
|
||||
FGraphicsPipelineStateInitializer GraphicsPSOInit;
|
||||
RHICmdList.ApplyCachedRenderTargets(GraphicsPSOInit);
|
||||
|
||||
// Blend over previous reflections in the output target (SSR or planar reflections that have already been rendered)
|
||||
// Planar reflections win over SSR and reflection environment
|
||||
//@todo - this is order dependent blending, but ordering is coming from registration order
|
||||
GraphicsPSOInit.BlendState = TStaticBlendState<CW_RGBA, BO_Add, BF_One, BF_InverseSourceAlpha, BO_Max, BF_One, BF_One>::GetRHI();
|
||||
GraphicsPSOInit.RasterizerState = TStaticRasterizerState<FM_Solid, CM_None>::GetRHI();
|
||||
GraphicsPSOInit.DepthStencilState = TStaticDepthStencilState<false, CF_Always>::GetRHI();
|
||||
|
||||
for (int32 PlanarReflectionIndex = 0; PlanarReflectionIndex < Scene->PlanarReflections.Num(); PlanarReflectionIndex++)
|
||||
if (!bSSRAsInput)
|
||||
{
|
||||
FPlanarReflectionSceneProxy* ReflectionSceneProxy = Scene->PlanarReflections[PlanarReflectionIndex];
|
||||
DrawClearQuad(RHICmdList, FLinearColor(0, 0, 0, 0));
|
||||
}
|
||||
|
||||
if (View.ViewFrustum.IntersectBox(ReflectionSceneProxy->WorldBounds.GetCenter(), ReflectionSceneProxy->WorldBounds.GetExtent()))
|
||||
{
|
||||
RHICmdList.SetViewport(View.ViewRect.Min.X, View.ViewRect.Min.Y, 0.0f, View.ViewRect.Max.X, View.ViewRect.Max.Y, 1.0f);
|
||||
|
||||
FGraphicsPipelineStateInitializer GraphicsPSOInit;
|
||||
RHICmdList.ApplyCachedRenderTargets(GraphicsPSOInit);
|
||||
|
||||
// Blend over previous reflections in the output target (SSR or planar reflections that have already been rendered)
|
||||
// Planar reflections win over SSR and reflection environment
|
||||
//@todo - this is order dependent blending, but ordering is coming from registration order
|
||||
GraphicsPSOInit.BlendState = TStaticBlendState<CW_RGBA, BO_Add, BF_One, BF_InverseSourceAlpha, BO_Max, BF_One, BF_One>::GetRHI();
|
||||
GraphicsPSOInit.RasterizerState = TStaticRasterizerState<FM_Solid, CM_None>::GetRHI();
|
||||
GraphicsPSOInit.DepthStencilState = TStaticDepthStencilState<false, CF_Always>::GetRHI();
|
||||
|
||||
for (int32 PlanarReflectionIndex = 0; PlanarReflectionIndex < Scene->PlanarReflections.Num(); PlanarReflectionIndex++)
|
||||
{
|
||||
SCOPED_DRAW_EVENTF(RHICmdList, PlanarReflection, *ReflectionSceneProxy->OwnerName.ToString());
|
||||
FPlanarReflectionSceneProxy* ReflectionSceneProxy = Scene->PlanarReflections[PlanarReflectionIndex];
|
||||
|
||||
TShaderMapRef<TDeferredLightVS<false> > VertexShader(View.ShaderMap);
|
||||
TShaderMapRef<FPlanarReflectionPS> PixelShader(View.ShaderMap);
|
||||
if (View.ViewFrustum.IntersectBox(ReflectionSceneProxy->WorldBounds.GetCenter(), ReflectionSceneProxy->WorldBounds.GetExtent()))
|
||||
{
|
||||
SCOPED_DRAW_EVENTF(RHICmdList, PlanarReflection, *ReflectionSceneProxy->OwnerName.ToString());
|
||||
|
||||
GraphicsPSOInit.BoundShaderState.VertexDeclarationRHI = GFilterVertexDeclaration.VertexDeclarationRHI;
|
||||
GraphicsPSOInit.BoundShaderState.VertexShaderRHI = GETSAFERHISHADER_VERTEX(*VertexShader);
|
||||
GraphicsPSOInit.BoundShaderState.PixelShaderRHI = GETSAFERHISHADER_PIXEL(*PixelShader);
|
||||
GraphicsPSOInit.PrimitiveType = PT_TriangleList;
|
||||
TShaderMapRef<TDeferredLightVS<false> > VertexShader(View.ShaderMap);
|
||||
TShaderMapRef<FPlanarReflectionPS> PixelShader(View.ShaderMap);
|
||||
|
||||
SetGraphicsPipelineState(RHICmdList, GraphicsPSOInit);
|
||||
GraphicsPSOInit.BoundShaderState.VertexDeclarationRHI = GFilterVertexDeclaration.VertexDeclarationRHI;
|
||||
GraphicsPSOInit.BoundShaderState.VertexShaderRHI = GETSAFERHISHADER_VERTEX(*VertexShader);
|
||||
GraphicsPSOInit.BoundShaderState.PixelShaderRHI = GETSAFERHISHADER_PIXEL(*PixelShader);
|
||||
GraphicsPSOInit.PrimitiveType = PT_TriangleList;
|
||||
|
||||
PixelShader->SetParameters(RHICmdList, View, ReflectionSceneProxy);
|
||||
VertexShader->SetSimpleLightParameters(RHICmdList, View, FSphere(0));
|
||||
SetGraphicsPipelineState(RHICmdList, GraphicsPSOInit);
|
||||
|
||||
DrawRectangle(
|
||||
RHICmdList,
|
||||
0, 0,
|
||||
View.ViewRect.Width(), View.ViewRect.Height(),
|
||||
View.ViewRect.Min.X, View.ViewRect.Min.Y,
|
||||
View.ViewRect.Width(), View.ViewRect.Height(),
|
||||
View.ViewRect.Size(),
|
||||
FSceneRenderTargets::Get(RHICmdList).GetBufferSizeXY(),
|
||||
*VertexShader,
|
||||
EDRF_UseTriangleOptimization);
|
||||
PixelShader->SetParameters(RHICmdList, View, ReflectionSceneProxy);
|
||||
VertexShader->SetSimpleLightParameters(RHICmdList, View, FSphere(0));
|
||||
|
||||
DrawRectangle(
|
||||
RHICmdList,
|
||||
0, 0,
|
||||
View.ViewRect.Width(), View.ViewRect.Height(),
|
||||
View.ViewRect.Min.X, View.ViewRect.Min.Y,
|
||||
View.ViewRect.Width(), View.ViewRect.Height(),
|
||||
View.ViewRect.Size(),
|
||||
FSceneRenderTargets::Get(RHICmdList).GetBufferSizeXY(),
|
||||
*VertexShader,
|
||||
EDRF_UseTriangleOptimization);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
RHICmdList.EndRenderPass();
|
||||
RHICmdList.CopyToResolveTarget(Output->GetRenderTargetItem().TargetableTexture, Output->GetRenderTargetItem().ShaderResourceTexture, FResolveParams());
|
||||
|
||||
return true;
|
||||
|
||||
Reference in New Issue
Block a user