diff --git a/03-UnrealEngine/卡通渲染相关资料/渲染功能/ShaderModel/GBuffer&Material&BasePass.md b/03-UnrealEngine/卡通渲染相关资料/渲染功能/ShaderModel/GBuffer&Material&BasePass.md index 069c092..6f6afe6 100644 --- a/03-UnrealEngine/卡通渲染相关资料/渲染功能/ShaderModel/GBuffer&Material&BasePass.md +++ b/03-UnrealEngine/卡通渲染相关资料/渲染功能/ShaderModel/GBuffer&Material&BasePass.md @@ -287,6 +287,59 @@ LazyPrintf.PushParam(!bEnableExecutionFlow ? *GenerateFunctionCode(MP_CustomData - `for (uint32 CustomUVIndex = 0; CustomUVIndex < NumUserTexCoords; CustomUVIndex++)` - `for (UMaterialExpressionVertexInterpolator* Interpolator : CustomVertexInterpolators` +### 添加ToonDataAssetID 与 ToonOutlineDataAssetID笔记 +1. FMaterialRenderProxy::UpdateDeferredCachedUniformExpressions() +2. FMaterialRenderProxy::EvaluateUniformExpressions() +3. FUniformExpressionSet::FillUniformBuffer() +4. EvaluatePreshader() +5. EvaluateParameter() +6. Context.MaterialRenderProxy->GetParameterValue() + +可以看得出关键数据在UniformExpressionSet中,这里的ParameterIndex则通过`EvaluateParameter(Stack, UniformExpressionSet, ReadPreshaderValue(Data), Context);`进行计算。 +```c++ +const FMaterialNumericParameterInfo& Parameter = UniformExpressionSet->GetNumericParameter(ParameterIndex); +bool bFoundParameter = false; + +// First allow proxy the chance to override parameter +if (Context.MaterialRenderProxy) +{ + FMaterialParameterValue ParameterValue; + if (Context.MaterialRenderProxy->GetParameterValue(Parameter.ParameterType, Parameter.ParameterInfo, ParameterValue, Context)) + { + Stack.PushValue(ParameterValue.AsShaderValue()); + bFoundParameter = true; + } +} + +bool FMaterialInstanceResource::GetParameterValue(EMaterialParameterType Type, const FHashedMaterialParameterInfo& ParameterInfo, FMaterialParameterValue& OutValue, const FMaterialRenderContext& Context) const +{ + checkSlow(IsInParallelRenderingThread()); + + bool bResult = false; + + // Check for hard-coded parameters + if (Type == EMaterialParameterType::Scalar && ParameterInfo.Name == GetSubsurfaceProfileParameterName()) + { + check(ParameterInfo.Association == EMaterialParameterAssociation::GlobalParameter); + const USubsurfaceProfile* MySubsurfaceProfileRT = GetSubsurfaceProfileRT(); + OutValue = GetSubsurfaceProfileId(MySubsurfaceProfileRT); + bResult = true; + } + else if (Type == EMaterialParameterType::Scalar && NumSpecularProfileRT() > 0) + { + for (uint32 It=0,Count=NumSpecularProfileRT();It