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::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())
{
@ -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的阴影)
{
屏蔽此阴影
}
```