From 4f3c7f05de444cf344fb1493e738a64a3409aaf0 Mon Sep 17 00:00:00 2001 From: BlueRose <378100977@qq.com> Date: Thu, 7 Mar 2024 16:58:43 +0800 Subject: [PATCH] vault backup: 2024-03-07 16:58:42 --- .../plugins/various-complements/data.json | 56 +------ .../渲染功能/ShaderModel/GBuffer&Material&BasePass.md | 154 +++++++++++++++--- 2 files changed, 143 insertions(+), 67 deletions(-) diff --git a/.obsidian/plugins/various-complements/data.json b/.obsidian/plugins/various-complements/data.json index aca79ab..23b3a6d 100644 --- a/.obsidian/plugins/various-complements/data.json +++ b/.obsidian/plugins/various-complements/data.json @@ -47,54 +47,6 @@ }, "showLogAboutPerformanceInConsole": false, "selectionHistoryTree": { - "FRDGViewableResource、FRDGTexture、FRDGTextureSRV、FRDGTextureUAV": { - "FRDGViewableResource、FRDGTexture、FRDGTextureSRV、FRDGTextureUAV": { - "currentFile": { - "count": 1, - "lastUpdated": 1707118005164 - } - } - }, - "FRDGViewableResource、FRDGTexture、FRDGTextureSRV、": { - "FRDGViewableResource、FRDGTexture、FRDGTextureSRV、": { - "currentFile": { - "count": 1, - "lastUpdated": 1707118021634 - } - } - }, - "FRDGView": { - "FRDGView": { - "currentFile": { - "count": 1, - "lastUpdated": 1707118039401 - } - } - }, - "FRDGViewableResource、FRDGTexture": { - "FRDGViewableResource、FRDGTexture": { - "currentFile": { - "count": 1, - "lastUpdated": 1707118633071 - } - } - }, - "RDG对象注册表": { - "RDG对象注册表": { - "currentFile": { - "count": 1, - "lastUpdated": 1707121888833 - } - } - }, - "FRDGResource": { - "FRDGResource": { - "currentFile": { - "count": 1, - "lastUpdated": 1707140527615 - } - } - }, "VertexBufferSRV": { "VertexBufferSRV": { "currentFile": { @@ -174,6 +126,14 @@ "lastUpdated": 1709717543852 } } + }, + "GBUFFER_HAS_VELOCITY": { + "GBUFFER_HAS_VELOCITY": { + "currentFile": { + "count": 1, + "lastUpdated": 1709798435896 + } + } } } } \ No newline at end of file diff --git a/03-UnrealEngine/卡通渲染相关资料/渲染功能/ShaderModel/GBuffer&Material&BasePass.md b/03-UnrealEngine/卡通渲染相关资料/渲染功能/ShaderModel/GBuffer&Material&BasePass.md index dc6b1c8..76fbb38 100644 --- a/03-UnrealEngine/卡通渲染相关资料/渲染功能/ShaderModel/GBuffer&Material&BasePass.md +++ b/03-UnrealEngine/卡通渲染相关资料/渲染功能/ShaderModel/GBuffer&Material&BasePass.md @@ -40,40 +40,30 @@ GBuffer相关信息(精度、顺序)可以参考FetchLegacyGBufferInfo()。 - 不存在Velocity与Tangent: - OutGBufferD(MRT4) - OutGBufferD(MRT5) - - ~~TargetSeparatedMainDirLight(MRT6)~~ + - TargetSeparatedMainDirLight(MRT6) - 存在Velocity: - TargetVelocity(MRT4) - OutGBufferD(MRT5) - OutGBufferE(MRT6) - - ~~TargetSeparatedMainDirLight(MRT7)~~ + - TargetSeparatedMainDirLight(MRT7) - 存在Tangent: - OutGBufferF(MRT4) - OutGBufferD(MRT5) - OutGBufferE(MRT6) - - ~~TargetSeparatedMainDirLight(MRT7)~~ + - TargetSeparatedMainDirLight(MRT7) 几个动态MRT的存在条件与Shader判断宏: ***查找IsUsingBasePassVelocity()*** 被使用过的地方。 -class RPGGAMEPLAYABILITY_API USDHCommonSettings : public UDeveloperSettings - - -UCLASS(config=Engine, defaultconfig, meta=(DisplayName="Rendering"), MinimalAPI) -class URendererSettings : public UDeveloperSettings - -UPROPERTY(config, EditAnywhere, Category = VirtualTextures, meta = ( - ConsoleVariable = "r.VirtualTextures", DisplayName = "Enable virtual texture support", - ToolTip = "When enabled, Textures can be streamed using the virtual texture system. Changing this setting requires restarting the editor.", - ConfigRestartRequired = true)) -uint32 bVirtualTextures : 1; - - - OutGBufferE(PrecomputedShadowFactors):r.AllowStaticLighting = 1 - - + - GBUFFER_HAS_PRECSHADOWFACTOR + - WRITES_PRECSHADOWFACTOR_ZERO + - WRITES_PRECSHADOWFACTOR_TO_GBUFFER - TargetVelocity:(IsUsingBasePassVelocity(Platform) || Layout == GBL_ForceVelocity) ? 1 : 0;//r.VelocityOutputPass = 1 - - + - GBUFFER_HAS_VELOCITY + - WRITES_VELOCITY_TO_GBUFFER - Tangent:false,目前单独使用另一组MRT来存储。 - - + - ~~GBUFFER_HAS_TANGENT~` ### ToonGBuffer修改&数据存储 ```c# @@ -94,6 +84,102 @@ TargetVelocity / OutGBufferF = velocity / tangent //目前先不考虑输出Velo 蓝色协议的方案 ![[蓝色协议的方案#GBuffer]] +***额外添加相关宏(逻辑位于ShaderCompiler.cpp)*** +- **GBUFFER_HAS_TOONDATA** + +### 修改GBuffer格式 +- [[#ShaderMaterialDerivedHelpers.cpp中的CalculateDerivedMaterialParameters()]]控制在BasePassPixelShader.usf中的MRT宏是否为true。 +- [[#BasePassRendering.cpp中ModifyBasePassCSPSCompilationEnvironment()]]控制Velocity与SingleLayerWater相关的RT精度。 +- [[#GBufferInfo.cpp中的FetchLegacyGBufferInfo()]]控制GBuffer精度以及数据打包情况。 + +#### BasePassRendering.cpp中ModifyBasePassCSPSCompilationEnvironment() +```c++ +void ModifyBasePassCSPSCompilationEnvironment() +{ +... + const bool bOutputVelocity = (GBufferLayout == GBL_ForceVelocity) || + FVelocityRendering::BasePassCanOutputVelocity(Parameters.Platform); + if (bOutputVelocity) + { + // As defined in BasePassPixelShader.usf. Also account for Strata setting velocity in slot 1 as described in FetchLegacyGBufferInfo. + const int32 VelocityIndex = Strata::IsStrataEnabled() ? 1 : (IsForwardShadingEnabled(Parameters.Platform) ? 1 : 4); + OutEnvironment.SetRenderTargetOutputFormat(VelocityIndex, PF_G16R16); + } +... + const bool bNeedsSeparateMainDirLightTexture = IsWaterDistanceFieldShadowEnabled(Parameters.Platform) || IsWaterVirtualShadowMapFilteringEnabled(Parameters.Platform); + if (bIsSingleLayerWater && bNeedsSeparateMainDirLightTexture) + { + // See FShaderCompileUtilities::FetchGBufferParamsRuntime for the details + const bool bHasTangent = false; + static const auto CVar = IConsoleManager::Get().FindTConsoleVariableDataInt(TEXT("r.AllowStaticLighting")); + bool bHasPrecShadowFactor = (CVar ? (CVar->GetValueOnAnyThread() != 0) : 1); + + uint32 TargetSeparatedMainDirLight = 5; + if (bOutputVelocity == false && bHasTangent == false) + { + TargetSeparatedMainDirLight = 5; + if (bHasPrecShadowFactor) + { + TargetSeparatedMainDirLight = 6; + } + } + else if (bOutputVelocity) + { + TargetSeparatedMainDirLight = 6; + if (bHasPrecShadowFactor) + { + TargetSeparatedMainDirLight = 7; + } + } + else if (bHasTangent) + { + TargetSeparatedMainDirLight = 6; + if (bHasPrecShadowFactor) + { + TargetSeparatedMainDirLight = 7; + } + } + OutEnvironment.SetRenderTargetOutputFormat(TargetSeparatedMainDirLight, PF_FloatR11G11B10); +... +} +``` + +#### GBufferInfo.cpp中的FetchLegacyGBufferInfo() +控制GBuffer精度以及数据打包情况。 + +#### ShaderMaterialDerivedHelpers.cpp中的CalculateDerivedMaterialParameters() +```c++ +else if (Mat.IS_BASE_PASS) + { + Dst.PIXELSHADEROUTPUT_BASEPASS = 1; + if (Dst.USES_GBUFFER) + { + Dst.PIXELSHADEROUTPUT_MRT0 = (!SrcGlobal.SELECTIVE_BASEPASS_OUTPUTS || Dst.NEEDS_BASEPASS_VERTEX_FOGGING || Mat.USES_EMISSIVE_COLOR || SrcGlobal.ALLOW_STATIC_LIGHTING || Mat.MATERIAL_SHADINGMODEL_SINGLELAYERWATER); + Dst.PIXELSHADEROUTPUT_MRT1 = ((!SrcGlobal.SELECTIVE_BASEPASS_OUTPUTS || !Mat.MATERIAL_SHADINGMODEL_UNLIT)); + Dst.PIXELSHADEROUTPUT_MRT2 = ((!SrcGlobal.SELECTIVE_BASEPASS_OUTPUTS || !Mat.MATERIAL_SHADINGMODEL_UNLIT)); + Dst.PIXELSHADEROUTPUT_MRT3 = ((!SrcGlobal.SELECTIVE_BASEPASS_OUTPUTS || !Mat.MATERIAL_SHADINGMODEL_UNLIT)); + if (SrcGlobal.GBUFFER_HAS_VELOCITY || SrcGlobal.GBUFFER_HAS_TANGENT) + { + Dst.PIXELSHADEROUTPUT_MRT4 = Dst.WRITES_VELOCITY_TO_GBUFFER || SrcGlobal.GBUFFER_HAS_TANGENT; + Dst.PIXELSHADEROUTPUT_MRT5 = (!SrcGlobal.SELECTIVE_BASEPASS_OUTPUTS || Dst.WRITES_CUSTOMDATA_TO_GBUFFER); + Dst.PIXELSHADEROUTPUT_MRT6 = (Dst.GBUFFER_HAS_PRECSHADOWFACTOR && (!SrcGlobal.SELECTIVE_BASEPASS_OUTPUTS || (Dst.WRITES_PRECSHADOWFACTOR_TO_GBUFFER && !Mat.MATERIAL_SHADINGMODEL_UNLIT))); + } + else + { + Dst.PIXELSHADEROUTPUT_MRT4 = (!SrcGlobal.SELECTIVE_BASEPASS_OUTPUTS || Dst.WRITES_CUSTOMDATA_TO_GBUFFER); + Dst.PIXELSHADEROUTPUT_MRT5 = (Dst.GBUFFER_HAS_PRECSHADOWFACTOR && (!SrcGlobal.SELECTIVE_BASEPASS_OUTPUTS || (Dst.WRITES_PRECSHADOWFACTOR_TO_GBUFFER && !Mat.MATERIAL_SHADINGMODEL_UNLIT))); + } + } + else + { + Dst.PIXELSHADEROUTPUT_MRT0 = true; + // we also need MRT for thin translucency due to dual blending if we are not on the fallback path + Dst.PIXELSHADEROUTPUT_MRT1 = (Dst.WRITES_VELOCITY_TO_GBUFFER || (Mat.DUAL_SOURCE_COLOR_BLENDING_ENABLED && Dst.MATERIAL_WORKS_WITH_DUAL_SOURCE_COLOR_BLENDING)); + } + } +} +``` + ### 是否需要Toon 在材质中: ```c++ @@ -113,6 +199,36 @@ FMaterialRelevance UMaterialInterface::GetRelevance_Internal(const UMaterial* Ma 在渲染管线中: ```c++ +//RenderUtils.cpp +bool IsUsingToonRendering(const FStaticShaderPlatform Platform) +{ +    static FShaderPlatformCachedIniValue PerPlatformCVar(TEXT("r.ToonRendering.Enable")); +    if (IsMobilePlatform(Platform) || IsForwardShadingEnabled(Platform))//目前不考虑VR与移动端 +    { +        return false; +    } +    else +    { +        return (PerPlatformCVar.Get(Platform) == 1); +    } +} + +bool IsUsingToonOutline(const FStaticShaderPlatform Platform) +{ +    static FShaderPlatformCachedIniValue PerPlatformCVar(TEXT("r.ToonRendering.ToonOutline")); +    return (PerPlatformCVar.Get(Platform) == 1) && IsUsingToonRendering(Platform); +} + +bool IsUsingToonRimLighting(const FStaticShaderPlatform Platform) +{ +    static FShaderPlatformCachedIniValue PerPlatformCVar(TEXT("r.ToonRendering.ToonRimLighting")); +    return (PerPlatformCVar.Get(Platform) == 1) && IsUsingToonRendering(Platform); +} +``` + + +李兄的ToonBuffer判断逻辑: +```c++ bool FDeferredShadingSceneRenderer::ShouldRenderToonDataPass() const { if (!SupportsToonDataMaterials(FeatureLevel, ShaderPlatform))