/** Returns true if the Material and Vertex Factory combination require adjacency information. */ bool RequiresAdjacencyInformation( UMaterialInterface* Material, const FVertexFactoryType* VertexFactoryType, ERHIFeatureLevel::Type InFeatureLevel ) { EMaterialTessellationMode TessellationMode = MTM_NoTessellation; bool bEnableCrackFreeDisplacement = false; if ( RHISupportsTessellation(GShaderPlatformForFeatureLevel[InFeatureLevel]) && VertexFactoryType->SupportsTessellationShaders() && Material ) { if ( IsInRenderingThread() ) { FMaterialRenderProxy* MaterialRenderProxy = Material->GetRenderProxy( false, false ); check( MaterialRenderProxy ); const FMaterial* MaterialResource = MaterialRenderProxy->GetMaterial(InFeatureLevel); check( MaterialResource ); TessellationMode = MaterialResource->GetTessellationMode(); bEnableCrackFreeDisplacement = MaterialResource->IsCrackFreeDisplacementEnabled(); } else if ( IsInGameThread() ) { UMaterial* BaseMaterial = Material->GetMaterial(); check( BaseMaterial ); TessellationMode = (EMaterialTessellationMode)BaseMaterial->D3D11TessellationMode; bEnableCrackFreeDisplacement = BaseMaterial->bEnableCrackFreeDisplacement; } else { UMaterialInterface::TMicRecursionGuard RecursionGuard; const UMaterial* BaseMaterial = Material->GetMaterial_Concurrent(RecursionGuard); check( BaseMaterial ); TessellationMode = (EMaterialTessellationMode)BaseMaterial->D3D11TessellationMode; bEnableCrackFreeDisplacement = BaseMaterial->bEnableCrackFreeDisplacement; } } return TessellationMode == MTM_PNTriangles || ( TessellationMode == MTM_FlatTessellation && bEnableCrackFreeDisplacement ); }
FVelocityDrawingPolicy::FVelocityDrawingPolicy( const FVertexFactory* InVertexFactory, const FMaterialRenderProxy* InMaterialRenderProxy, const FMaterial& InMaterialResource, ERHIFeatureLevel::Type InFeatureLevel ) : FMeshDrawingPolicy(InVertexFactory,InMaterialRenderProxy,InMaterialResource) { const FMaterialShaderMap* MaterialShaderIndex = InMaterialResource.GetRenderingThreadShaderMap(); const FMeshMaterialShaderMap* MeshShaderIndex = MaterialShaderIndex->GetMeshShaderMap(InVertexFactory->GetType()); HullShader = NULL; DomainShader = NULL; const EMaterialTessellationMode MaterialTessellationMode = InMaterialResource.GetTessellationMode(); if (RHISupportsTessellation(GShaderPlatformForFeatureLevel[InFeatureLevel]) && InVertexFactory->GetType()->SupportsTessellationShaders() && MaterialTessellationMode != MTM_NoTessellation) { bool HasHullShader = MeshShaderIndex->HasShader(&FVelocityHS::StaticType); bool HasDomainShader = MeshShaderIndex->HasShader(&FVelocityDS::StaticType); HullShader = HasHullShader ? MeshShaderIndex->GetShader<FVelocityHS>() : NULL; DomainShader = HasDomainShader ? MeshShaderIndex->GetShader<FVelocityDS>() : NULL; } bool HasVertexShader = MeshShaderIndex->HasShader(&FVelocityVS::StaticType); VertexShader = HasVertexShader ? MeshShaderIndex->GetShader<FVelocityVS>() : NULL; bool HasPixelShader = MeshShaderIndex->HasShader(&FVelocityPS::StaticType); PixelShader = HasPixelShader ? MeshShaderIndex->GetShader<FVelocityPS>() : NULL; }
FDepthDrawingPolicy::FDepthDrawingPolicy( const FVertexFactory* InVertexFactory, const FMaterialRenderProxy* InMaterialRenderProxy, const FMaterial& InMaterialResource, bool bIsTwoSided, ERHIFeatureLevel::Type InFeatureLevel ): FMeshDrawingPolicy(InVertexFactory,InMaterialRenderProxy,InMaterialResource,false,/*bInTwoSidedOverride=*/ bIsTwoSided) { // The primitive needs to be rendered with the material's pixel and vertex shaders if it is masked bNeedsPixelShader = false; if (InMaterialResource.IsMasked()) { bNeedsPixelShader = true; PixelShader = InMaterialResource.GetShader<FDepthOnlyPS>(InVertexFactory->GetType()); } else { PixelShader = NULL; } const EMaterialTessellationMode TessellationMode = InMaterialResource.GetTessellationMode(); VertexShader = NULL; HullShader = NULL; DomainShader = NULL; if (RHISupportsTessellation(GShaderPlatformForFeatureLevel[InFeatureLevel]) && InVertexFactory->GetType()->SupportsTessellationShaders() && TessellationMode != MTM_NoTessellation) { VertexShader = InMaterialResource.GetShader<TDepthOnlyVS<false> >(VertexFactory->GetType()); HullShader = InMaterialResource.GetShader<FDepthOnlyHS>(VertexFactory->GetType()); DomainShader = InMaterialResource.GetShader<FDepthOnlyDS>(VertexFactory->GetType()); } else { VertexShader = InMaterialResource.GetShader<TDepthOnlyVS<false> >(InVertexFactory->GetType()); } }
TDistortionMeshDrawingPolicy<DistortMeshPolicy>::TDistortionMeshDrawingPolicy( const FVertexFactory* InVertexFactory, const FMaterialRenderProxy* InMaterialRenderProxy, const FMaterial& InMaterialResource, bool bInInitializeOffsets, bool bInOverrideWithShaderComplexity, ERHIFeatureLevel::Type InFeatureLevel ) : FMeshDrawingPolicy(InVertexFactory,InMaterialRenderProxy,InMaterialResource,bInOverrideWithShaderComplexity) , bInitializeOffsets(bInInitializeOffsets) { HullShader = NULL; DomainShader = NULL; const EMaterialTessellationMode MaterialTessellationMode = MaterialResource->GetTessellationMode(); if (RHISupportsTessellation(GShaderPlatformForFeatureLevel[InFeatureLevel]) && InVertexFactory->GetType()->SupportsTessellationShaders() && MaterialTessellationMode != MTM_NoTessellation) { HullShader = InMaterialResource.GetShader<TDistortionMeshHS<DistortMeshPolicy>>(VertexFactory->GetType()); DomainShader = InMaterialResource.GetShader<TDistortionMeshDS<DistortMeshPolicy>>(VertexFactory->GetType()); } VertexShader = InMaterialResource.GetShader<TDistortionMeshVS<DistortMeshPolicy> >(InVertexFactory->GetType()); if (bInitializeOffsets) { //later InitializePixelShader = GetGlobalShaderMap(View.ShaderMap)->GetShader<FShaderComplexityAccumulatePixelShader>(); DistortPixelShader = NULL; } else { DistortPixelShader = InMaterialResource.GetShader<TDistortionMeshPS<DistortMeshPolicy> >(InVertexFactory->GetType()); //later InitializePixelShader = NULL; } }