FMaterialShader::FMaterialShader(const FMaterialShaderType::CompiledShaderInitializerType& Initializer) : FShader(Initializer) , DebugUniformExpressionSet(Initializer.UniformExpressionSet) , DebugDescription(Initializer.DebugDescription) { check(!DebugDescription.IsEmpty()); // Bind the material uniform buffer parameter. MaterialUniformBuffer.Bind(Initializer.ParameterMap,TEXT("Material")); for (int32 CollectionIndex = 0; CollectionIndex < Initializer.UniformExpressionSet.ParameterCollections.Num(); CollectionIndex++) { FShaderUniformBufferParameter CollectionParameter; CollectionParameter.Bind(Initializer.ParameterMap,*FString::Printf(TEXT("MaterialCollection%u"), CollectionIndex)); ParameterCollectionUniformBuffers.Add(CollectionParameter); } for (int32 Index = 0; Index < Initializer.UniformExpressionSet.PerFrameUniformScalarExpressions.Num(); Index++) { FShaderParameter Parameter; Parameter.Bind(Initializer.ParameterMap, *FString::Printf(TEXT("UE_Material_PerFrameScalarExpression%u"), Index)); PerFrameScalarExpressions.Add(Parameter); } for (int32 Index = 0; Index < Initializer.UniformExpressionSet.PerFrameUniformVectorExpressions.Num(); Index++) { FShaderParameter Parameter; Parameter.Bind(Initializer.ParameterMap, *FString::Printf(TEXT("UE_Material_PerFrameVectorExpression%u"), Index)); PerFrameVectorExpressions.Add(Parameter); } for (int32 Index = 0; Index < Initializer.UniformExpressionSet.PerFramePrevUniformScalarExpressions.Num(); Index++) { FShaderParameter Parameter; Parameter.Bind(Initializer.ParameterMap, *FString::Printf(TEXT("UE_Material_PerFramePrevScalarExpression%u"), Index)); PerFramePrevScalarExpressions.Add(Parameter); } for (int32 Index = 0; Index < Initializer.UniformExpressionSet.PerFramePrevUniformVectorExpressions.Num(); Index++) { FShaderParameter Parameter; Parameter.Bind(Initializer.ParameterMap, *FString::Printf(TEXT("UE_Material_PerFramePrevVectorExpression%u"), Index)); PerFramePrevVectorExpressions.Add(Parameter); } DeferredParameters.Bind(Initializer.ParameterMap); LightAttenuation.Bind(Initializer.ParameterMap, TEXT("LightAttenuationTexture")); LightAttenuationSampler.Bind(Initializer.ParameterMap, TEXT("LightAttenuationTextureSampler")); AtmosphericFogTextureParameters.Bind(Initializer.ParameterMap); EyeAdaptation.Bind(Initializer.ParameterMap, TEXT("EyeAdaptation")); // only used it Material has expression that requires PerlinNoiseGradientTexture PerlinNoiseGradientTexture.Bind(Initializer.ParameterMap,TEXT("PerlinNoiseGradientTexture")); PerlinNoiseGradientTextureSampler.Bind(Initializer.ParameterMap,TEXT("PerlinNoiseGradientTextureSampler")); // only used it Material has expression that requires PerlinNoise3DTexture PerlinNoise3DTexture.Bind(Initializer.ParameterMap,TEXT("PerlinNoise3DTexture")); PerlinNoise3DTextureSampler.Bind(Initializer.ParameterMap,TEXT("PerlinNoise3DTextureSampler")); GlobalDistanceFieldParameters.Bind(Initializer.ParameterMap); }
/** * Construct a shader from shader compiler output. */ FShader::FShader(const CompiledShaderInitializerType& Initializer): MaterialShaderMapHash(Initializer.MaterialShaderMapHash), VFType(Initializer.VertexFactoryType), Type(Initializer.Type), Target(Initializer.Target), NumRefs(0), SetParametersId(0), Canary(ShaderMagic_Initialized) { OutputHash = Initializer.OutputHash; checkSlow(OutputHash != FSHAHash()); if (Type) { // Store off the source hash that this shader was compiled with // This will be used as part of the shader key in order to identify when shader files have been changed and a recompile is needed SourceHash = Type->GetSourceHash(); } if (VFType) { // Store off the VF source hash that this shader was compiled with VFSourceHash = VFType->GetSourceHash(); } // Bind uniform buffer parameters automatically for (TLinkedList<FUniformBufferStruct*>::TIterator StructIt(FUniformBufferStruct::GetStructList()); StructIt; StructIt.Next()) { if (Initializer.ParameterMap.ContainsParameterAllocation(StructIt->GetShaderVariableName())) { UniformBufferParameterStructs.Add(*StructIt); UniformBufferParameters.Add(StructIt->ConstructTypedParameter()); FShaderUniformBufferParameter* Parameter = UniformBufferParameters.Last(); Parameter->Bind(Initializer.ParameterMap, StructIt->GetShaderVariableName(), SPF_Mandatory); } } SetResource(Initializer.Resource); // Register the shader now that it is valid, so that it can be reused Register(); }