/** * Render a dynamic mesh using a translucent draw policy * @return true if the mesh rendered */ bool FTranslucencyForwardShadingDrawingPolicyFactory::DrawDynamicMesh( FRHICommandList& RHICmdList, const FViewInfo& View, ContextType DrawingContext, const FMeshBatch& Mesh, bool bBackFace, bool bPreFog, const FPrimitiveSceneProxy* PrimitiveSceneProxy, FHitProxyId HitProxyId ) { bool bDirty = false; // Determine the mesh's material and blend mode. const auto FeatureLevel = View.GetFeatureLevel(); const auto ShaderPlatform = View.GetShaderPlatform(); const FMaterial* Material = Mesh.MaterialRenderProxy->GetMaterial(FeatureLevel); const EBlendMode BlendMode = Material->GetBlendMode(); // Only render translucent materials. if (IsTranslucentBlendMode(BlendMode)) { const bool bDisableDepthTest = Material->ShouldDisableDepthTest(); if (bDisableDepthTest) { RHICmdList.SetDepthStencilState(TStaticDepthStencilState<false, CF_Always>::GetRHI()); } ProcessBasePassMeshForForwardShading( RHICmdList, FProcessBasePassMeshParameters( Mesh, Material, PrimitiveSceneProxy, true, false, ESceneRenderTargetsMode::SetTextures, FeatureLevel ), FDrawTranslucentMeshForwardShadingAction( View, bBackFace, HitProxyId ) ); if (bDisableDepthTest) { // Restore default depth state // Note, this is a reversed Z depth surface, using CF_GreaterEqual. RHICmdList.SetDepthStencilState(TStaticDepthStencilState<false, CF_GreaterEqual>::GetRHI()); } bDirty = true; } return bDirty; }
void Process( FRHICommandList& RHICmdList, const FProcessBasePassMeshParameters& Parameters, const LightMapPolicyType& LightMapPolicy, const typename LightMapPolicyType::ElementDataType& LightMapElementData ) const { #if !(UE_BUILD_SHIPPING || UE_BUILD_TEST) // Treat masked materials as if they don't occlude in shader complexity, which is PVR behavior if(Parameters.BlendMode == BLEND_Masked && View.Family->EngineShowFlags.ShaderComplexity) { // Note, this is a reversed Z depth surface, using CF_GreaterEqual. RHICmdList.SetDepthStencilState(TStaticDepthStencilState<false,CF_GreaterEqual>::GetRHI()); } #endif const bool bIsLitMaterial = Parameters.ShadingModel != MSM_Unlit; const FScene* Scene = Parameters.PrimitiveSceneProxy ? Parameters.PrimitiveSceneProxy->GetPrimitiveSceneInfo()->Scene : NULL; TBasePassForForwardShadingDrawingPolicy<LightMapPolicyType> DrawingPolicy( Parameters.Mesh.VertexFactory, Parameters.Mesh.MaterialRenderProxy, *Parameters.Material, LightMapPolicy, Parameters.BlendMode, Parameters.TextureMode, Parameters.ShadingModel != MSM_Unlit && Scene && Scene->ShouldRenderSkylight(), View.Family->EngineShowFlags.ShaderComplexity, View.GetFeatureLevel() ); RHICmdList.BuildAndSetLocalBoundShaderState(DrawingPolicy.GetBoundShaderStateInput(View.GetFeatureLevel())); DrawingPolicy.SetSharedState(RHICmdList, &View, typename TBasePassForForwardShadingDrawingPolicy<LightMapPolicyType>::ContextDataType()); for( int32 BatchElementIndex=0;BatchElementIndex<Parameters.Mesh.Elements.Num();BatchElementIndex++ ) { DrawingPolicy.SetMeshRenderState( RHICmdList, View, Parameters.PrimitiveSceneProxy, Parameters.Mesh, BatchElementIndex, bBackFace, typename TBasePassForForwardShadingDrawingPolicy<LightMapPolicyType>::ElementDataType(LightMapElementData), typename TBasePassForForwardShadingDrawingPolicy<LightMapPolicyType>::ContextDataType() ); DrawingPolicy.DrawMesh(RHICmdList, Parameters.Mesh, BatchElementIndex); } // Restore #if !(UE_BUILD_SHIPPING || UE_BUILD_TEST) if(Parameters.BlendMode == BLEND_Masked && View.Family->EngineShowFlags.ShaderComplexity) { // Note, this is a reversed Z depth surface, using CF_GreaterEqual. RHICmdList.SetDepthStencilState(TStaticDepthStencilState<true,CF_GreaterEqual>::GetRHI()); } #endif }
void FTranslucencyDrawingPolicyFactory::CopySceneColor(FRHICommandList& RHICmdList, const FViewInfo& View, const FPrimitiveSceneProxy* PrimitiveSceneProxy) { SCOPED_DRAW_EVENTF(RHICmdList, EventCopy, TEXT("CopySceneColor for %s %s"), *PrimitiveSceneProxy->GetOwnerName().ToString(), *PrimitiveSceneProxy->GetResourceName().ToString()); RHICmdList.SetRasterizerState(TStaticRasterizerState<FM_Solid, CM_None>::GetRHI()); RHICmdList.SetDepthStencilState(TStaticDepthStencilState<false, CF_Always>::GetRHI()); RHICmdList.SetBlendState(TStaticBlendState<>::GetRHI()); GSceneRenderTargets.ResolveSceneColor(RHICmdList); GSceneRenderTargets.BeginRenderingLightAttenuation(RHICmdList); RHICmdList.SetViewport(View.ViewRect.Min.X, View.ViewRect.Min.Y, 0.0f, View.ViewRect.Max.X, View.ViewRect.Max.Y, 1.0f); TShaderMapRef<FScreenVS> ScreenVertexShader(View.ShaderMap); TShaderMapRef<FCopySceneColorPS> PixelShader(View.ShaderMap); SetGlobalBoundShaderState(RHICmdList, View.GetFeatureLevel(), CopySceneColorBoundShaderState, GFilterVertexDeclaration.VertexDeclarationRHI, *ScreenVertexShader, *PixelShader); /// ? PixelShader->SetParameters(RHICmdList, View); DrawRectangle( RHICmdList, 0, 0, View.ViewRect.Width(), View.ViewRect.Height(), View.ViewRect.Min.X, View.ViewRect.Min.Y, View.ViewRect.Width(), View.ViewRect.Height(), FIntPoint(View.ViewRect.Width(), View.ViewRect.Height()), GSceneRenderTargets.GetBufferSizeXY(), *ScreenVertexShader, EDRF_UseTriangleOptimization); GSceneRenderTargets.FinishRenderingLightAttenuation(RHICmdList); }
/** Draws a full view quad that sets stencil to 1 anywhere that decals should not be projected. */ void StencilDecalMask(FRHICommandList& RHICmdList, const FViewInfo& View, bool bUseHmdMesh) { SCOPED_DRAW_EVENT(RHICmdList, StencilDecalMask); FSceneRenderTargets& SceneContext = FSceneRenderTargets::Get(RHICmdList); RHICmdList.SetRasterizerState(TStaticRasterizerState<FM_Solid, CM_None>::GetRHI()); RHICmdList.SetBlendState(TStaticBlendState<CW_NONE>::GetRHI()); SetRenderTarget(RHICmdList, NULL, SceneContext.GetSceneDepthSurface(), ESimpleRenderTargetMode::EUninitializedColorExistingDepth, FExclusiveDepthStencil::DepthRead_StencilWrite); RHICmdList.SetViewport(View.ViewRect.Min.X, View.ViewRect.Min.Y, 0.0f, View.ViewRect.Max.X, View.ViewRect.Max.Y, 1.0f); // Write 1 to highest bit of stencil to areas that should not receive decals RHICmdList.SetDepthStencilState(TStaticDepthStencilState<false, CF_Always, true, CF_Always, SO_Replace, SO_Replace, SO_Replace>::GetRHI(), 0x80); const auto FeatureLevel = View.GetFeatureLevel(); auto ShaderMap = View.ShaderMap; TShaderMapRef<FScreenVS> ScreenVertexShader(ShaderMap); TShaderMapRef<FStencilDecalMaskPS> PixelShader(ShaderMap); SetGlobalBoundShaderState(RHICmdList, FeatureLevel, StencilDecalMaskBoundShaderState, GFilterVertexDeclaration.VertexDeclarationRHI, *ScreenVertexShader, *PixelShader); PixelShader->SetParameters(RHICmdList, View); DrawPostProcessPass( RHICmdList, 0, 0, View.ViewRect.Width(), View.ViewRect.Height(), View.ViewRect.Min.X, View.ViewRect.Min.Y, View.ViewRect.Width(), View.ViewRect.Height(), FIntPoint(View.ViewRect.Width(), View.ViewRect.Height()), SceneContext.GetBufferSizeXY(), *ScreenVertexShader, View.StereoPass, bUseHmdMesh, EDRF_UseTriangleOptimization); }
static void SetVelocitiesState(FRHICommandList& RHICmdList, const FViewInfo& View, TRefCountPtr<IPooledRenderTarget>& VelocityRT) { const FIntPoint BufferSize = GSceneRenderTargets.GetBufferSizeXY(); const FIntPoint VelocityBufferSize = BufferSize; // full resolution so we can reuse the existing full res z buffer const uint32 MinX = View.ViewRect.Min.X * VelocityBufferSize.X / BufferSize.X; const uint32 MinY = View.ViewRect.Min.Y * VelocityBufferSize.Y / BufferSize.Y; const uint32 MaxX = View.ViewRect.Max.X * VelocityBufferSize.X / BufferSize.X; const uint32 MaxY = View.ViewRect.Max.Y * VelocityBufferSize.Y / BufferSize.Y; RHICmdList.SetViewport(MinX, MinY, 0.0f, MaxX, MaxY, 1.0f); RHICmdList.SetBlendState(TStaticBlendState<CW_RGBA>::GetRHI()); // Note, this is a reversed Z depth surface, using CF_GreaterEqual. RHICmdList.SetDepthStencilState(TStaticDepthStencilState<false,CF_GreaterEqual>::GetRHI()); RHICmdList.SetRasterizerState(GetStaticRasterizerState<true>(FM_Solid, CM_CW)); }
static void SetTranslucentRenderTargetAndState(FRHICommandList& RHICmdList, const FViewInfo& View, bool bSeparateTranslucencyPass, bool bFirstTimeThisFrame = false) { bool bSetupTranslucentState = true; if (bSeparateTranslucencyPass && GSceneRenderTargets.IsSeparateTranslucencyActive(View)) { bSetupTranslucentState = GSceneRenderTargets.BeginRenderingSeparateTranslucency(RHICmdList, View, bFirstTimeThisFrame); } else { GSceneRenderTargets.BeginRenderingTranslucency(RHICmdList, View); } if (bSetupTranslucentState) { // Enable depth test, disable depth writes. // Note, this is a reversed Z depth surface, using CF_GreaterEqual. RHICmdList.SetDepthStencilState(TStaticDepthStencilState<false, CF_GreaterEqual>::GetRHI()); } }
void FinishOcclusionTerm(FRHICommandList& RHICmdList, const FViewInfo& View, const FLightSceneInfo* const LightSceneInfo, TRefCountPtr<IPooledRenderTarget>& LightShaftsSource, TRefCountPtr<IPooledRenderTarget>& LightShaftsDest) { TShaderMapRef<FScreenVS> ScreenVertexShader(View.ShaderMap); const FIntPoint BufferSize = FSceneRenderTargets::Get(RHICmdList).GetBufferSizeXY(); const uint32 DownsampleFactor = GetLightShaftDownsampleFactor(); const FIntPoint FilterBufferSize = BufferSize / DownsampleFactor; const FIntPoint DownSampledXY = View.ViewRect.Min / DownsampleFactor; const uint32 DownsampledSizeX = View.ViewRect.Width() / DownsampleFactor; const uint32 DownsampledSizeY = View.ViewRect.Height() / DownsampleFactor; SetRenderTarget(RHICmdList, LightShaftsDest->GetRenderTargetItem().TargetableTexture, FTextureRHIRef()); RHICmdList.SetViewport(0, 0, 0.0f, FilterBufferSize.X, FilterBufferSize.Y, 1.0f); RHICmdList.SetBlendState(TStaticBlendState<>::GetRHI()); RHICmdList.SetRasterizerState(TStaticRasterizerState<>::GetRHI()); RHICmdList.SetDepthStencilState(TStaticDepthStencilState<false, CF_Always>::GetRHI()); TShaderMapRef<FFinishOcclusionPixelShader> MaskOcclusionTermPixelShader(View.ShaderMap); SetGlobalBoundShaderState(RHICmdList, View.GetFeatureLevel(), AccumulateTermBoundShaderState, GFilterVertexDeclaration.VertexDeclarationRHI, *ScreenVertexShader, *MaskOcclusionTermPixelShader); /// ? MaskOcclusionTermPixelShader->SetParameters(RHICmdList, LightSceneInfo, View, LightShaftsSource); { // Apply a radial blur to the bloom and occlusion mask DrawRectangle( RHICmdList, DownSampledXY.X, DownSampledXY.Y, DownsampledSizeX, DownsampledSizeY, DownSampledXY.X, DownSampledXY.Y, DownsampledSizeX, DownsampledSizeY, FilterBufferSize, FilterBufferSize, *ScreenVertexShader, EDRF_UseTriangleOptimization); } RHICmdList.CopyToResolveTarget(LightShaftsDest->GetRenderTargetItem().TargetableTexture, LightShaftsDest->GetRenderTargetItem().ShaderResourceTexture, false, FResolveParams()); }
void FLightPropagationVolume::Visualise(FRHICommandList& RHICmdList, const FViewInfo& View) const { SCOPED_DRAW_EVENT(RHICmdList, LpvVisualise); check(View.GetFeatureLevel() == ERHIFeatureLevel::SM5); TShaderMapRef<FLpvVisualiseVS> VertexShader(View.ShaderMap); TShaderMapRef<FLpvVisualiseGS> GeometryShader(View.ShaderMap); TShaderMapRef<FLpvVisualisePS> PixelShader(View.ShaderMap); RHICmdList.SetDepthStencilState(TStaticDepthStencilState<false, CF_Always>::GetRHI()); RHICmdList.SetRasterizerState(TStaticRasterizerState<FM_Solid, CM_None>::GetRHI()); RHICmdList.SetBlendState(TStaticBlendState<CW_RGB, BO_Add, BF_One, BF_One>::GetRHI()); SetGlobalBoundShaderState(RHICmdList, View.GetFeatureLevel(), LpvVisBoundShaderState, GSimpleElementVertexDeclaration.VertexDeclarationRHI, *VertexShader, *PixelShader, *GeometryShader); VertexShader->SetParameters(RHICmdList, View); GeometryShader->SetParameters(RHICmdList, View); PixelShader->SetParameters(RHICmdList, this, View); RHICmdList.SetStreamSource(0, NULL, 0, 0); RHICmdList.DrawPrimitive(PT_PointList, 0, 1, 32 * 3); PixelShader->UnbindBuffers(RHICmdList); }
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); }
// 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])); } } }
// TODO: REMOVE if no longer needed: void FSceneRenderer::GammaCorrectToViewportRenderTarget(FRHICommandList& RHICmdList, const FViewInfo* View, float OverrideGamma) { // Set the view family's render target/viewport. SetRenderTarget(RHICmdList, ViewFamily.RenderTarget->GetRenderTargetTexture(), FTextureRHIRef()); // Deferred the clear until here so the garbage left in the non rendered regions by the post process effects do not show up if( ViewFamily.bDeferClear ) { RHICmdList.Clear(true, FLinearColor::Black, false, 0.0f, false, 0, FIntRect()); ViewFamily.bDeferClear = false; } SCOPED_DRAW_EVENT(RHICmdList, GammaCorrection); // turn off culling and blending RHICmdList.SetRasterizerState(TStaticRasterizerState<FM_Solid, CM_None>::GetRHI()); RHICmdList.SetBlendState(TStaticBlendState<>::GetRHI()); // turn off depth reads/writes RHICmdList.SetDepthStencilState(TStaticDepthStencilState<false, CF_Always>::GetRHI()); TShaderMapRef<FGammaCorrectionVS> VertexShader(View->ShaderMap); TShaderMapRef<FGammaCorrectionPS> PixelShader(View->ShaderMap); static FGlobalBoundShaderState PostProcessBoundShaderState; SetGlobalBoundShaderState(RHICmdList, View->GetFeatureLevel(), PostProcessBoundShaderState, GFilterVertexDeclaration.VertexDeclarationRHI, *VertexShader, *PixelShader); float InvDisplayGamma = 1.0f / ViewFamily.RenderTarget->GetDisplayGamma(); if (OverrideGamma != 0) { InvDisplayGamma = 1 / OverrideGamma; } const FPixelShaderRHIParamRef ShaderRHI = PixelShader->GetPixelShader(); SetShaderValue( RHICmdList, ShaderRHI, PixelShader->InverseGamma, InvDisplayGamma ); SetShaderValue(RHICmdList, ShaderRHI,PixelShader->ColorScale,View->ColorScale); SetShaderValue(RHICmdList, ShaderRHI,PixelShader->OverlayColor,View->OverlayColor); const FTextureRHIRef DesiredSceneColorTexture = GSceneRenderTargets.GetSceneColorTexture(); SetTextureParameter( RHICmdList, ShaderRHI, PixelShader->SceneTexture, PixelShader->SceneTextureSampler, TStaticSamplerState<SF_Bilinear>::GetRHI(), DesiredSceneColorTexture ); // Draw a quad mapping scene color to the view's render target DrawRectangle( RHICmdList, View->UnscaledViewRect.Min.X,View->UnscaledViewRect.Min.Y, View->UnscaledViewRect.Width(),View->UnscaledViewRect.Height(), View->ViewRect.Min.X,View->ViewRect.Min.Y, View->ViewRect.Width(),View->ViewRect.Height(), ViewFamily.RenderTarget->GetSizeXY(), GSceneRenderTargets.GetBufferSizeXY(), *VertexShader, EDRF_UseTriangleOptimization); }
void Process( FRHICommandList& RHICmdList, const FProcessBasePassMeshParameters& Parameters, const LightMapPolicyType& LightMapPolicy, const typename LightMapPolicyType::ElementDataType& LightMapElementData ) const { const bool bIsLitMaterial = Parameters.ShadingModel != MSM_Unlit; #if !(UE_BUILD_SHIPPING || UE_BUILD_TEST) // When rendering masked materials in the shader complexity viewmode, // We want to overwrite complexity for the pixels which get depths written, // And accumulate complexity for pixels which get killed due to the opacity mask being below the clip value. // This is accomplished by forcing the masked materials to render depths in the depth only pass, // Then rendering in the base pass with additive complexity blending, depth tests on, and depth writes off. if(View.Family->EngineShowFlags.ShaderComplexity) { RHICmdList.SetDepthStencilState(TStaticDepthStencilState<false,CF_DepthNearOrEqual>::GetRHI()); } const FSceneRenderTargets& SceneContext = FSceneRenderTargets::Get(RHICmdList); #endif const FScene* Scene = Parameters.PrimitiveSceneProxy ? Parameters.PrimitiveSceneProxy->GetPrimitiveSceneInfo()->Scene : NULL; TBasePassDrawingPolicy<LightMapPolicyType> DrawingPolicy( Parameters.Mesh.VertexFactory, Parameters.Mesh.MaterialRenderProxy, *Parameters.Material, Parameters.FeatureLevel, LightMapPolicy, Parameters.BlendMode, Parameters.TextureMode, Scene && Scene->SkyLight && !Scene->SkyLight->bHasStaticLighting && Scene->SkyLight->bWantsStaticShadowing && bIsLitMaterial, IsTranslucentBlendMode(Parameters.BlendMode) && (Scene && Scene->HasAtmosphericFog()) && View.Family->EngineShowFlags.AtmosphericFog, View.Family->EngineShowFlags.ShaderComplexity, false, Parameters.bEditorCompositeDepthTest, /* bInEnableReceiveDecalOutput = */ Scene != nullptr, View.Family->GetQuadOverdrawMode() ); RHICmdList.BuildAndSetLocalBoundShaderState(DrawingPolicy.GetBoundShaderStateInput(View.GetFeatureLevel())); DrawingPolicy.SetSharedState(RHICmdList, &View, typename TBasePassDrawingPolicy<LightMapPolicyType>::ContextDataType(Parameters.bIsInstancedStereo, false)); const FMeshDrawingRenderState DrawRenderState(DitheredLODTransitionAlpha); for( int32 BatchElementIndex = 0, Num = Parameters.Mesh.Elements.Num(); BatchElementIndex < Num; BatchElementIndex++ ) { // We draw instanced static meshes twice when rendering with instanced stereo. Once for each eye. const bool bIsInstancedMesh = Parameters.Mesh.Elements[BatchElementIndex].bIsInstancedMesh; const uint32 InstancedStereoDrawCount = (Parameters.bIsInstancedStereo && bIsInstancedMesh) ? 2 : 1; for (uint32 DrawCountIter = 0; DrawCountIter < InstancedStereoDrawCount; ++DrawCountIter) { DrawingPolicy.SetInstancedEyeIndex(RHICmdList, DrawCountIter); TDrawEvent<FRHICommandList> MeshEvent; BeginMeshDrawEvent(RHICmdList, Parameters.PrimitiveSceneProxy, Parameters.Mesh, MeshEvent); DrawingPolicy.SetMeshRenderState( RHICmdList, View, Parameters.PrimitiveSceneProxy, Parameters.Mesh, BatchElementIndex, bBackFace, DrawRenderState, typename TBasePassDrawingPolicy<LightMapPolicyType>::ElementDataType(LightMapElementData), typename TBasePassDrawingPolicy<LightMapPolicyType>::ContextDataType() ); DrawingPolicy.DrawMesh(RHICmdList, Parameters.Mesh, BatchElementIndex, Parameters.bIsInstancedStereo); } } #if !(UE_BUILD_SHIPPING || UE_BUILD_TEST) if(View.Family->EngineShowFlags.ShaderComplexity) { RHICmdList.SetDepthStencilState(TStaticDepthStencilState<true,CF_DepthNearOrEqual>::GetRHI()); } #endif }