vault backup: 2024-12-16 10:18:10

This commit is contained in:
BlueRose 2024-12-16 10:18:10 +08:00
parent 934d40aff9
commit fe0b3e18b8

View File

@ -768,7 +768,7 @@ ShadowProjectionPixelShader.usf
- FProjectedShadowInfo::SetupFrustumForProjection()构建阴影投影4棱椎平面信息。 - FProjectedShadowInfo::SetupFrustumForProjection()构建阴影投影4棱椎平面信息。
- FProjectedShadowInfo::SetupProjectionStencilMask() - FProjectedShadowInfo::SetupProjectionStencilMask()
# 其他 ## 其他
顺序: 顺序:
RenderCustomDepthPass 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提出 由晨风&Neverwind提出
- 【[UFSH2024]用虚幻引擎5为《幻塔》定制高品质动画流程风格化渲染管线 | 晨风 Neverwind 完美世界游戏】 【精准空降到 07:27】 https://www.bilibili.com/video/BV1rW2LYvEox/?share_source=copy_web&vd_source=fe8142e8e12816535feaeabd6f6cdc8e&t=447 - 【[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() 额外进行一次CreatePerObjectProjectedShadow()
{ {
处理阴影光照Matrix 处理阴影光照Matrix //猜测:
向阴影信息写入IsHalfViewShadowFlag //在ProjectedShadowInfo->SetupPerObjectProjection()中调整FProjectedShadowInfo.TranslatedWorldToView。
用新的光源方向画Atlas //在LightSceneInfo->Proxy->GetPerObjectProjectedShadowInitializer(Bounds, ShadowInitializer)之后修改WorldTolight。
向阴影信息写入IsHalfViewShadowFlag//猜测在FProjectedShadowInfo中添加判断Flag并且写入。
用新的光源方向画Atlas //猜测给带有对应Flog的DirectionLigh多创建一个对应的Atlas
} }
} }
``` ```
**阴影Projection阶段**: 截图代码(半程阴影修改LightDirection逻辑)
//此阶段需要屏蔽角色投射到自己的非半程阴影
//和角色投射到场景中会跟随视角移动的阴影
```c++
if(Toon材质,且没有程阴影Flag的阴影
&&非Toon材质但有半程阴影Flag的阴影)
{
屏蔽此阴影
}
```
截图代码:
```c++ ```c++
if(PrimitiveSceneinfo->Proxy->IsToonDisableSelfShadow()) if(PrimitiveSceneinfo->Proxy->IsToonDisableSelfShadow())
{ {
@ -876,3 +883,16 @@ if(PrimitiveSceneinfo->Proxy->IsToonDisableSelfShadow())
... ...
} }
``` ```
PS.很有可能需要创建2个Atlas。Atlas的创建位于***FSceneRenderer::AllocateCachedShadowDepthTargets()***。数据存储在***SortedShadowsForShadowDepthPass.ShadowMapAtlases***中。大致由FSceneRenderer::FinishInitDynamicShadows()调用。
**阴影Projection阶段**:
//此阶段需要屏蔽角色投射到自己的非半程阴影
//和角色投射到场景中会跟随视角移动的阴影
```c++
if(Toon材质,且没有程阴影Flag的阴影
&&非Toon材质但有半程阴影Flag的阴影)
{
屏蔽此阴影
}
```