From fe0b3e18b89861e589f5aaa849bcceebf9eb6544 Mon Sep 17 00:00:00 2001 From: BlueRose <378100977@qq.com> Date: Mon, 16 Dec 2024 10:18:10 +0800 Subject: [PATCH] vault backup: 2024-12-16 10:18:10 --- .../渲染功能/阴影控制/ToonShadow.md | 54 +++++++++++++------ 1 file changed, 37 insertions(+), 17 deletions(-) diff --git a/03-UnrealEngine/卡通渲染相关资料/渲染功能/阴影控制/ToonShadow.md b/03-UnrealEngine/卡通渲染相关资料/渲染功能/阴影控制/ToonShadow.md index 8cac0fe..5206187 100644 --- a/03-UnrealEngine/卡通渲染相关资料/渲染功能/阴影控制/ToonShadow.md +++ b/03-UnrealEngine/卡通渲染相关资料/渲染功能/阴影控制/ToonShadow.md @@ -768,7 +768,7 @@ ShadowProjectionPixelShader.usf - FProjectedShadowInfo::SetupFrustumForProjection():构建阴影投影4棱椎平面信息。 - FProjectedShadowInfo::SetupProjectionStencilMask(): -# 其他 +## 其他 顺序: RenderCustomDepthPass @@ -829,6 +829,22 @@ if (RendererOutput == ERendererOutput::DepthPrepassOnly) ``` + +# RenderLights +FDeferredShadingSceneRenderer::RenderLights() +=> +RDG_EVENT_SCOPE(GraphBuilder, "UnbatchedLights");//batchedLights为没有LightFunction与没有阴影的灯光。 +=> +for (int32 LightIndex = UnbatchedLightStart; LightIndex < LumenLightStart; LightIndex++) +=> +if (bDrawShadows){...} => ***RenderDeferredShadowProjections()*** +=> +if (bDirectLighting){...} +if (bDirectLighting){...} + +## RenderDeferredShadowProjections() + + # 半程阴影 由晨风&Neverwind提出: - 【[UFSH2024]用虚幻引擎5为《幻塔》定制高品质动画流程风格化渲染管线 | 晨风 Neverwind 完美世界游戏】 【精准空降到 07:27】 https://www.bilibili.com/video/BV1rW2LYvEox/?share_source=copy_web&vd_source=fe8142e8e12816535feaeabd6f6cdc8e&t=447 @@ -839,25 +855,16 @@ if 启用半程阴影: { 额外进行一次CreatePerObjectProjectedShadow() { - 处理阴影光照Matrix - 向阴影信息写入IsHalfViewShadowFlag - 用新的光源方向画Atlas + 处理阴影光照Matrix //猜测: + //在ProjectedShadowInfo->SetupPerObjectProjection()中调整,FProjectedShadowInfo.TranslatedWorldToView。 + //在LightSceneInfo->Proxy->GetPerObjectProjectedShadowInitializer(Bounds, ShadowInitializer)之后,修改WorldTolight。 + 向阴影信息写入IsHalfViewShadowFlag//猜测:在FProjectedShadowInfo中添加判断Flag并且写入。 + 用新的光源方向画Atlas //猜测:给带有对应Flog的DirectionLigh多创建一个对应的Atlas? } } ``` -**阴影Projection阶段**: -//此阶段需要屏蔽角色投射到自己的非半程阴影 -//和角色投射到场景中会跟随视角移动的阴影 -```c++ -if(Toon材质,且没有程阴影Flag的阴影 -&&非Toon材质但有半程阴影Flag的阴影) -{ - 屏蔽此阴影 -} -``` - -截图代码: +截图代码(半程阴影修改LightDirection逻辑): ```c++ if(PrimitiveSceneinfo->Proxy->IsToonDisableSelfShadow()) { @@ -875,4 +882,17 @@ if(PrimitiveSceneinfo->Proxy->IsToonDisableSelfShadow()) } ... } -``` \ No newline at end of file +``` + +PS.很有可能需要创建2个Atlas。Atlas的创建位于***FSceneRenderer::AllocateCachedShadowDepthTargets()***。数据存储在***SortedShadowsForShadowDepthPass.ShadowMapAtlases***中。大致由FSceneRenderer::FinishInitDynamicShadows()调用。 + +**阴影Projection阶段**: +//此阶段需要屏蔽角色投射到自己的非半程阴影 +//和角色投射到场景中会跟随视角移动的阴影 +```c++ +if(Toon材质,且没有程阴影Flag的阴影 +&&非Toon材质但有半程阴影Flag的阴影) +{ + 屏蔽此阴影 +} +```