void FDecalRendering::SetShader(FRHICommandList& RHICmdList, const FViewInfo& View, bool bShaderComplexity, const FTransientDecalRenderData& DecalData, const FMatrix& FrustumComponentToClip) { const FMaterialShaderMap* MaterialShaderMap = DecalData.MaterialResource->GetRenderingThreadShaderMap(); auto PixelShader = MaterialShaderMap->GetShader<FDeferredDecalPS>(); TShaderMapRef<FDeferredDecalVS> VertexShader(View.ShaderMap); if(bShaderComplexity) { TShaderMapRef<FShaderComplexityAccumulatePS> VisualizePixelShader(View.ShaderMap); const uint32 NumPixelShaderInstructions = PixelShader->GetNumInstructions(); const uint32 NumVertexShaderInstructions = VertexShader->GetNumInstructions(); static FGlobalBoundShaderState BoundShaderState; SetGlobalBoundShaderState(RHICmdList, View.GetFeatureLevel(), BoundShaderState, GetVertexDeclarationFVector4(), *VertexShader, *VisualizePixelShader); VisualizePixelShader->SetParameters(RHICmdList, NumVertexShaderInstructions, NumPixelShaderInstructions, View.GetFeatureLevel()); } else { // first Bind, then SetParameters() RHICmdList.SetLocalBoundShaderState(RHICmdList.BuildLocalBoundShaderState(GetVertexDeclarationFVector4(), VertexShader->GetVertexShader(), FHullShaderRHIRef(), FDomainShaderRHIRef(), PixelShader->GetPixelShader(), FGeometryShaderRHIRef())); PixelShader->SetParameters(RHICmdList, View, DecalData.MaterialProxy, *DecalData.DecalProxy, DecalData.FadeAlpha); } VertexShader->SetParameters(RHICmdList, View, FrustumComponentToClip); }
void FDecalRendering::SetShader(FRHICommandList& RHICmdList, const FViewInfo& View, bool bShaderComplexity, const FTransientDecalRenderData& DecalData, const FMatrix& FrustumComponentToClip) { const FMaterialShaderMap* MaterialShaderMap = DecalData.MaterialResource->GetRenderingThreadShaderMap(); auto PixelShader = MaterialShaderMap->GetShader<FDeferredDecalPS>(); TShaderMapRef<FDeferredDecalVS> VertexShader(View.ShaderMap); // we don't have the Primitive uniform buffer setup for decals (later we want to batch) { auto& PrimitiveVS = VertexShader->GetUniformBufferParameter<FPrimitiveUniformShaderParameters>(); auto& PrimitivePS = PixelShader->GetUniformBufferParameter<FPrimitiveUniformShaderParameters>(); // uncomment to track down usage of the Primitive uniform buffer // check(!PrimitiveVS.IsBound()); // check(!PrimitivePS.IsBound()); // to prevent potential shader error (UE-18852 ElementalDemo crashes due to nil constant buffer) SetUniformBufferParameter(RHICmdList, VertexShader->GetVertexShader(), PrimitiveVS, GIdentityPrimitiveUniformBuffer); SetUniformBufferParameter(RHICmdList, PixelShader->GetPixelShader(), PrimitivePS, GIdentityPrimitiveUniformBuffer); } if(bShaderComplexity) { TShaderMapRef<FShaderComplexityAccumulatePS> VisualizePixelShader(View.ShaderMap); const uint32 NumPixelShaderInstructions = PixelShader->GetNumInstructions(); const uint32 NumVertexShaderInstructions = VertexShader->GetNumInstructions(); static FGlobalBoundShaderState BoundShaderState; SetGlobalBoundShaderState(RHICmdList, View.GetFeatureLevel(), BoundShaderState, GetVertexDeclarationFVector4(), *VertexShader, *VisualizePixelShader); VisualizePixelShader->SetParameters(RHICmdList, NumVertexShaderInstructions, NumPixelShaderInstructions, View.GetFeatureLevel()); } else { // first Bind, then SetParameters() RHICmdList.SetLocalBoundShaderState(RHICmdList.BuildLocalBoundShaderState(GetVertexDeclarationFVector4(), VertexShader->GetVertexShader(), FHullShaderRHIRef(), FDomainShaderRHIRef(), PixelShader->GetPixelShader(), FGeometryShaderRHIRef())); PixelShader->SetParameters(RHICmdList, View, DecalData.MaterialProxy, *DecalData.DecalProxy, DecalData.FadeAlpha); } VertexShader->SetParameters(RHICmdList, View, FrustumComponentToClip); }
void FDecalRendering::SetShader(FRHICommandList& RHICmdList, const FViewInfo& View, const FTransientDecalRenderData& DecalData, const FMatrix& FrustumComponentToClip) { const FMaterialShaderMap* MaterialShaderMap = DecalData.MaterialResource->GetRenderingThreadShaderMap(); auto PixelShader = MaterialShaderMap->GetShader<FDeferredDecalPS>(); TShaderMapRef<FDeferredDecalVS> VertexShader(View.ShaderMap); const EDebugViewShaderMode DebugViewShaderMode = View.Family->GetDebugViewShaderMode(); if (DebugViewShaderMode != DVSM_None) { // For this to work, decal VS must output compatible interpolants. Currently this requires to use FDebugPSInLean. // Here we pass nullptr for the material interface because the use of a static bound shader state is only compatible with unique shaders. IDebugViewModePSInterface* DebugPixelShader = FDebugViewMode::GetPSInterface(View.ShaderMap, nullptr, DebugViewShaderMode); const uint32 NumPixelShaderInstructions = PixelShader->GetNumInstructions(); const uint32 NumVertexShaderInstructions = VertexShader->GetNumInstructions(); static FGlobalBoundShaderState BoundShaderState[DVSM_MAX]; SetGlobalBoundShaderState(RHICmdList, View.GetFeatureLevel(), BoundShaderState[(uint32)DebugViewShaderMode], GetVertexDeclarationFVector4(), *VertexShader, DebugPixelShader->GetShader()); DebugPixelShader->SetParameters(RHICmdList, *VertexShader, PixelShader, DecalData.MaterialProxy, *DecalData.MaterialResource, View); DebugPixelShader->SetMesh(RHICmdList, View); } else { // first Bind, then SetParameters() RHICmdList.SetLocalBoundShaderState(RHICmdList.BuildLocalBoundShaderState(GetVertexDeclarationFVector4(), VertexShader->GetVertexShader(), FHullShaderRHIRef(), FDomainShaderRHIRef(), PixelShader->GetPixelShader(), FGeometryShaderRHIRef())); PixelShader->SetParameters(RHICmdList, View, DecalData.MaterialProxy, *DecalData.DecalProxy, DecalData.FadeAlpha); } // SetUniformBufferParameter() need to happen after the shader has been set otherwise a DebugBreak could occur. // we don't have the Primitive uniform buffer setup for decals (later we want to batch) { auto& PrimitiveVS = VertexShader->GetUniformBufferParameter<FPrimitiveUniformShaderParameters>(); auto& PrimitivePS = PixelShader->GetUniformBufferParameter<FPrimitiveUniformShaderParameters>(); // uncomment to track down usage of the Primitive uniform buffer // check(!PrimitiveVS.IsBound()); // check(!PrimitivePS.IsBound()); // to prevent potential shader error (UE-18852 ElementalDemo crashes due to nil constant buffer) SetUniformBufferParameter(RHICmdList, VertexShader->GetVertexShader(), PrimitiveVS, GIdentityPrimitiveUniformBuffer); if (DebugViewShaderMode == DVSM_None) { SetUniformBufferParameter(RHICmdList, PixelShader->GetPixelShader(), PrimitivePS, GIdentityPrimitiveUniformBuffer); } } VertexShader->SetParameters(RHICmdList, View, FrustumComponentToClip); }
static void ResolveColorWideInternal2( FRHICommandList& RHICmdList, const ERHIFeatureLevel::Type CurrentFeatureLevel, const FTextureRHIRef& SrcTexture, const FIntPoint& SrcOrigin) { auto ShaderMap = GetGlobalShaderMap(CurrentFeatureLevel); TShaderMapRef<FWideCustomResolveVS> VertexShader(ShaderMap); TShaderMapRef<FWideCustomResolvePS<MSAA, Width>> PixelShader(ShaderMap); static FGlobalBoundShaderState BoundShaderState; SetGlobalBoundShaderState(RHICmdList, CurrentFeatureLevel, BoundShaderState, GetVertexDeclarationFVector4(), *VertexShader, *PixelShader); PixelShader->SetParameters(RHICmdList, SrcTexture, SrcOrigin); RHICmdList.DrawPrimitive(PT_TriangleList, 0, 1, 1); }
static void ClearQuadSetup( FRHICommandList& RHICmdList, ERHIFeatureLevel::Type FeatureLevel, bool bClearColor, int32 NumClearColors, const FLinearColor* ClearColorArray, bool bClearDepth, float Depth, bool bClearStencil, uint32 Stencil ) { // Set new states FBlendStateRHIParamRef BlendStateRHI; if (NumClearColors <= 1) { BlendStateRHI = bClearColor ? TStaticBlendState<>::GetRHI() : TStaticBlendState<CW_NONE>::GetRHI(); } else { BlendStateRHI = bClearColor ? TStaticBlendState<>::GetRHI() : TStaticBlendStateWriteMask<CW_NONE,CW_NONE,CW_NONE,CW_NONE,CW_NONE,CW_NONE,CW_NONE,CW_NONE>::GetRHI(); } const FDepthStencilStateRHIParamRef DepthStencilStateRHI = (bClearDepth && bClearStencil) ? TStaticDepthStencilState< true, CF_Always, true,CF_Always,SO_Replace,SO_Replace,SO_Replace, false,CF_Always,SO_Replace,SO_Replace,SO_Replace, 0xff,0xff >::GetRHI() : bClearDepth ? TStaticDepthStencilState<true, CF_Always>::GetRHI() : bClearStencil ? TStaticDepthStencilState< false, CF_Always, true,CF_Always,SO_Replace,SO_Replace,SO_Replace, false,CF_Always,SO_Replace,SO_Replace,SO_Replace, 0xff,0xff >::GetRHI() : TStaticDepthStencilState<false, CF_Always>::GetRHI(); RHICmdList.SetRasterizerState(TStaticRasterizerState<FM_Solid, CM_None>::GetRHI()); RHICmdList.SetBlendState(BlendStateRHI); RHICmdList.SetDepthStencilState(DepthStencilStateRHI); auto ShaderMap = GetGlobalShaderMap(FeatureLevel); // Set the new shaders TShaderMapRef<TOneColorVS<true> > VertexShader(ShaderMap); FOneColorPS* PixelShader = NULL; // Set the shader to write to the appropriate number of render targets // On AMD PC hardware, outputting to a color index in the shader without a matching render target set has a significant performance hit if (NumClearColors <= 1) { TShaderMapRef<TOneColorPixelShaderMRT<1> > MRTPixelShader(ShaderMap); PixelShader = *MRTPixelShader; } else if (NumClearColors == 2) { TShaderMapRef<TOneColorPixelShaderMRT<2> > MRTPixelShader(ShaderMap); PixelShader = *MRTPixelShader; } else if (NumClearColors == 3) { TShaderMapRef<TOneColorPixelShaderMRT<3> > MRTPixelShader(ShaderMap); PixelShader = *MRTPixelShader; } else if (NumClearColors == 4) { TShaderMapRef<TOneColorPixelShaderMRT<4> > MRTPixelShader(ShaderMap); PixelShader = *MRTPixelShader; } else if (NumClearColors == 5) { TShaderMapRef<TOneColorPixelShaderMRT<5> > MRTPixelShader(ShaderMap); PixelShader = *MRTPixelShader; } else if (NumClearColors == 6) { TShaderMapRef<TOneColorPixelShaderMRT<6> > MRTPixelShader(ShaderMap); PixelShader = *MRTPixelShader; } else if (NumClearColors == 7) { TShaderMapRef<TOneColorPixelShaderMRT<7> > MRTPixelShader(ShaderMap); PixelShader = *MRTPixelShader; } else if (NumClearColors == 8) { TShaderMapRef<TOneColorPixelShaderMRT<8> > MRTPixelShader(ShaderMap); PixelShader = *MRTPixelShader; } SetGlobalBoundShaderState(RHICmdList, FeatureLevel, GClearMRTBoundShaderState[FMath::Max(NumClearColors - 1, 0)], GetVertexDeclarationFVector4(), *VertexShader, PixelShader); PixelShader->SetColors(RHICmdList, ClearColorArray, NumClearColors); }
void FDecalRendering::SetVertexShaderOnly(FRHICommandList& RHICmdList, const FViewInfo& View, const FMatrix& FrustumComponentToClip) { TShaderMapRef<FDeferredDecalVS> VertexShader(View.ShaderMap); RHICmdList.SetLocalBoundShaderState(RHICmdList.BuildLocalBoundShaderState(GetVertexDeclarationFVector4(), VertexShader->GetVertexShader(), FHullShaderRHIRef(), FDomainShaderRHIRef(), NULL, FGeometryShaderRHIRef())); VertexShader->SetParameters(RHICmdList, View, FrustumComponentToClip); }
// TODO support ExcludeRect void DrawClearQuadMRT(FRHICommandList& RHICmdList, ERHIFeatureLevel::Type FeatureLevel, bool bClearColor, int32 NumClearColors, const FLinearColor* ClearColorArray, bool bClearDepth, float Depth, bool bClearStencil, uint32 Stencil) { // Set new states FBlendStateRHIParamRef BlendStateRHI; if (NumClearColors <= 1) { BlendStateRHI = bClearColor ? TStaticBlendState<>::GetRHI() : TStaticBlendState<CW_NONE>::GetRHI(); } else { BlendStateRHI = bClearColor ? TStaticBlendState<>::GetRHI() : TStaticBlendStateWriteMask<CW_NONE,CW_NONE,CW_NONE,CW_NONE,CW_NONE,CW_NONE,CW_NONE,CW_NONE>::GetRHI(); } const FDepthStencilStateRHIParamRef DepthStencilStateRHI = (bClearDepth && bClearStencil) ? TStaticDepthStencilState< true, CF_Always, true,CF_Always,SO_Replace,SO_Replace,SO_Replace, false,CF_Always,SO_Replace,SO_Replace,SO_Replace, 0xff,0xff >::GetRHI() : bClearDepth ? TStaticDepthStencilState<true, CF_Always>::GetRHI() : bClearStencil ? TStaticDepthStencilState< false, CF_Always, true,CF_Always,SO_Replace,SO_Replace,SO_Replace, false,CF_Always,SO_Replace,SO_Replace,SO_Replace, 0xff,0xff >::GetRHI() : TStaticDepthStencilState<false, CF_Always>::GetRHI(); RHICmdList.SetRasterizerState(TStaticRasterizerState<FM_Solid, CM_None>::GetRHI()); RHICmdList.SetBlendState(BlendStateRHI); RHICmdList.SetDepthStencilState(DepthStencilStateRHI); auto ShaderMap = GetGlobalShaderMap(FeatureLevel); // Set the new shaders TShaderMapRef<TOneColorVS<true> > VertexShader(ShaderMap); FOneColorPS* PixelShader = NULL; // Set the shader to write to the appropriate number of render targets // On AMD PC hardware, outputting to a color index in the shader without a matching render target set has a significant performance hit if (NumClearColors <= 1) { TShaderMapRef<TOneColorPixelShaderMRT<1> > MRTPixelShader(ShaderMap); PixelShader = *MRTPixelShader; } else if (NumClearColors == 2) { TShaderMapRef<TOneColorPixelShaderMRT<2> > MRTPixelShader(ShaderMap); PixelShader = *MRTPixelShader; } else if (NumClearColors == 3) { TShaderMapRef<TOneColorPixelShaderMRT<3> > MRTPixelShader(ShaderMap); PixelShader = *MRTPixelShader; } else if (NumClearColors == 4) { TShaderMapRef<TOneColorPixelShaderMRT<4> > MRTPixelShader(ShaderMap); PixelShader = *MRTPixelShader; } else if (NumClearColors == 5) { TShaderMapRef<TOneColorPixelShaderMRT<5> > MRTPixelShader(ShaderMap); PixelShader = *MRTPixelShader; } else if (NumClearColors == 6) { TShaderMapRef<TOneColorPixelShaderMRT<6> > MRTPixelShader(ShaderMap); PixelShader = *MRTPixelShader; } else if (NumClearColors == 7) { TShaderMapRef<TOneColorPixelShaderMRT<7> > MRTPixelShader(ShaderMap); PixelShader = *MRTPixelShader; } else if (NumClearColors == 8) { TShaderMapRef<TOneColorPixelShaderMRT<8> > MRTPixelShader(ShaderMap); PixelShader = *MRTPixelShader; } SetGlobalBoundShaderState(RHICmdList, FeatureLevel, GClearMRTBoundShaderState[FMath::Max(NumClearColors - 1, 0)], GetVertexDeclarationFVector4(), *VertexShader, PixelShader); FLinearColor ShaderClearColors[MaxSimultaneousRenderTargets]; FMemory::Memzero(ShaderClearColors); for (int32 i = 0; i < NumClearColors; i++) { ShaderClearColors[i] = ClearColorArray[i]; } SetShaderValueArray(RHICmdList, PixelShader->GetPixelShader(),PixelShader->ColorParameter,ShaderClearColors,NumClearColors); { // Draw a fullscreen quad /*if(ExcludeRect.Width() > 0 && ExcludeRect.Height() > 0) { // with a hole in it (optimization in case the hardware has non constant clear performance) FVector4 OuterVertices[4]; OuterVertices[0].Set( -1.0f, 1.0f, Depth, 1.0f ); OuterVertices[1].Set( 1.0f, 1.0f, Depth, 1.0f ); OuterVertices[2].Set( 1.0f, -1.0f, Depth, 1.0f ); OuterVertices[3].Set( -1.0f, -1.0f, Depth, 1.0f ); float InvViewWidth = 1.0f / Viewport.Width; float InvViewHeight = 1.0f / Viewport.Height; FVector4 FractionRect = FVector4(ExcludeRect.Min.X * InvViewWidth, ExcludeRect.Min.Y * InvViewHeight, (ExcludeRect.Max.X - 1) * InvViewWidth, (ExcludeRect.Max.Y - 1) * InvViewHeight); FVector4 InnerVertices[4]; InnerVertices[0].Set( FMath::Lerp(-1.0f, 1.0f, FractionRect.X), FMath::Lerp(1.0f, -1.0f, FractionRect.Y), Depth, 1.0f ); InnerVertices[1].Set( FMath::Lerp(-1.0f, 1.0f, FractionRect.Z), FMath::Lerp(1.0f, -1.0f, FractionRect.Y), Depth, 1.0f ); InnerVertices[2].Set( FMath::Lerp(-1.0f, 1.0f, FractionRect.Z), FMath::Lerp(1.0f, -1.0f, FractionRect.W), Depth, 1.0f ); InnerVertices[3].Set( FMath::Lerp(-1.0f, 1.0f, FractionRect.X), FMath::Lerp(1.0f, -1.0f, FractionRect.W), Depth, 1.0f ); FVector4 Vertices[10]; Vertices[0] = OuterVertices[0]; Vertices[1] = InnerVertices[0]; Vertices[2] = OuterVertices[1]; Vertices[3] = InnerVertices[1]; Vertices[4] = OuterVertices[2]; Vertices[5] = InnerVertices[2]; Vertices[6] = OuterVertices[3]; Vertices[7] = InnerVertices[3]; Vertices[8] = OuterVertices[0]; Vertices[9] = InnerVertices[0]; DrawPrimitiveUP(RHICmdList, PT_TriangleStrip, 8, Vertices, sizeof(Vertices[0]) ); } else*/ { // without a hole FVector4 Vertices[4]; Vertices[0].Set( -1.0f, 1.0f, Depth, 1.0f ); Vertices[1].Set( 1.0f, 1.0f, Depth, 1.0f ); Vertices[2].Set( -1.0f, -1.0f, Depth, 1.0f ); Vertices[3].Set( 1.0f, -1.0f, Depth, 1.0f ); DrawPrimitiveUP(RHICmdList, PT_TriangleStrip, 2, Vertices, sizeof(Vertices[0])); } } }
/** * Clears view where Z is still at the maximum value (ie no geometry rendered) */ void FDeferredShadingSceneRenderer::ClearGBufferAtMaxZ() { // Assumes BeginRenderingSceneColor() has been called before this function SCOPED_DRAW_EVENT(ClearGBufferAtMaxZ, DEC_SCENE_ITEMS); // Clear the G Buffer render targets const bool bClearBlack = Views[0].Family->EngineShowFlags.ShaderComplexity || Views[0].Family->EngineShowFlags.StationaryLightOverlap; // Same clear color from RHIClearMRT FLinearColor ClearColors[6] = {bClearBlack ? FLinearColor(0,0,0,0) : Views[0].BackgroundColor, FLinearColor(0.5f,0.5f,0.5f,0), FLinearColor(0,0,0,1), FLinearColor(0,0,0,0), FLinearColor(0,1,1,1), FLinearColor(1,1,1,1)}; uint32 NumActiveRenderTargets = GSceneRenderTargets.GetNumGBufferTargets(); TShaderMapRef<FOneColorVS> VertexShader(GetGlobalShaderMap()); FOneColorPS* PixelShader = NULL; // Assume for now all code path supports SM4, otherwise render target numbers are changed switch(NumActiveRenderTargets) { case 5: { TShaderMapRef<TOneColorPixelShaderMRT<5> > MRTPixelShader(GetGlobalShaderMap()); PixelShader = *MRTPixelShader; } break; case 6: { TShaderMapRef<TOneColorPixelShaderMRT<6> > MRTPixelShader(GetGlobalShaderMap()); PixelShader = *MRTPixelShader; } break; default: case 1: { TShaderMapRef<TOneColorPixelShaderMRT<1> > MRTPixelShader(GetGlobalShaderMap()); PixelShader = *MRTPixelShader; } break; } SetGlobalBoundShaderState(GClearMRTBoundShaderState[NumActiveRenderTargets - 1], GetVertexDeclarationFVector4(), *VertexShader, PixelShader); // Opaque rendering, depth test but no depth writes RHISetRasterizerState( TStaticRasterizerState<FM_Solid,CM_None>::GetRHI() ); RHISetBlendState(TStaticBlendStateWriteMask<>::GetRHI()); // Note, this is a reversed Z depth surface, using CF_GreaterEqual. RHISetDepthStencilState(TStaticDepthStencilState<false,CF_GreaterEqual>::GetRHI()); // Clear each viewport by drawing background color at MaxZ depth for(int32 ViewIndex = 0;ViewIndex < Views.Num();ViewIndex++) { SCOPED_CONDITIONAL_DRAW_EVENTF(EventView, Views.Num() > 1, DEC_SCENE_ITEMS, TEXT("ClearView%d"), ViewIndex); FViewInfo& View = Views[ViewIndex]; // Set viewport for this view RHISetViewport(View.ViewRect.Min.X, View.ViewRect.Min.Y, 0, View.ViewRect.Max.X, View.ViewRect.Max.Y, 1); // Setup PS SetShaderValueArray(PixelShader->GetPixelShader(),PixelShader->ColorParameter, ClearColors, NumActiveRenderTargets); // Render quad RHIDrawPrimitiveUP(PT_TriangleStrip, 2, ClearQuadVertices, sizeof(ClearQuadVertices[0]) ); } }
void FRCPassPostProcessMaterial::Process(FRenderingCompositePassContext& Context) { FMaterialRenderProxy* Proxy = MaterialInterface->GetRenderProxy(false); check(Proxy); const FMaterial* Material = Proxy->GetMaterial(Context.View.GetFeatureLevel()); check(Material); SCOPED_DRAW_EVENTF(Context.RHICmdList, PostProcessMaterial, TEXT("PostProcessMaterial Material=%s"), *Material->GetFriendlyName()); const FPooledRenderTargetDesc* InputDesc = GetInputDesc(ePId_Input0); if(!InputDesc) { // input is not hooked up correctly return; } const FSceneView& View = Context.View; const FSceneViewFamily& ViewFamily = *(View.Family); // hacky cast FRenderingCompositePassContext RenderingCompositePassContext(Context.RHICmdList, (FViewInfo&)View); RenderingCompositePassContext.Pass = this; FIntRect SrcRect = View.ViewRect; FIntRect DestRect = View.ViewRect; FIntPoint SrcSize = InputDesc->Extent; const FSceneRenderTargetItem& DestRenderTarget = PassOutputs[0].RequestSurface(Context); // Set the view family's render target/viewport. SetRenderTarget(Context.RHICmdList, DestRenderTarget.TargetableTexture, FTextureRHIParamRef()); if( ViewFamily.RenderTarget->GetRenderTargetTexture() != DestRenderTarget.TargetableTexture ) { Context.RHICmdList.Clear(true, FLinearColor::Black, false, 1.0f, false, 0, View.ViewRect); } Context.SetViewportAndCallRHI(View.ViewRect); // set the state Context.RHICmdList.SetBlendState(TStaticBlendState<>::GetRHI()); Context.RHICmdList.SetRasterizerState(TStaticRasterizerState<>::GetRHI()); Context.RHICmdList.SetDepthStencilState(TStaticDepthStencilState<false, CF_Always>::GetRHI()); float ScaleX = 1.0f / InputDesc->Extent.X; float ScaleY = 1.0f / InputDesc->Extent.Y; const FMaterialShaderMap* MaterialShaderMap = Material->GetRenderingThreadShaderMap(); FPostProcessMaterialPS* PixelShader = MaterialShaderMap->GetShader<FPostProcessMaterialPS>(); FPostProcessMaterialVS* VertexShader = MaterialShaderMap->GetShader<FPostProcessMaterialVS>(); Context.RHICmdList.SetLocalBoundShaderState(Context.RHICmdList.BuildLocalBoundShaderState(GetVertexDeclarationFVector4(), VertexShader->GetVertexShader(), FHullShaderRHIRef(), FDomainShaderRHIRef(), PixelShader->GetPixelShader(), FGeometryShaderRHIRef())); VertexShader->SetParameters(Context.RHICmdList, Context); PixelShader->SetParameters(Context.RHICmdList, Context, MaterialInterface->GetRenderProxy(false)); DrawRectangle( Context.RHICmdList, 0, 0, DestRect.Width(), DestRect.Height(), SrcRect.Min.X, SrcRect.Min.Y, SrcRect.Width(), SrcRect.Height(), DestRect.Size(), SrcSize, VertexShader, EDRF_UseTriangleOptimization); Context.RHICmdList.CopyToResolveTarget(DestRenderTarget.TargetableTexture, DestRenderTarget.ShaderResourceTexture, false, FResolveParams()); if(Material->NeedsGBuffer()) { GSceneRenderTargets.AdjustGBufferRefCount(-1); } }