2.8 KiB
Raw Blame History

title, date, excerpt, tags, rating
title date excerpt tags rating
Untitled 2024-12-08 12:18:54

前言

阴影渲染笔记:Shadow

实现功能:

  1. 控制深度偏移
  2. CustomDepth制作头发阴影偏移效果哦 https://zhuanlan.zhihu.com/p/689578355
  3. ContactShadow接触阴影实现衣服细节的DetailShadow
  4. 半程阴影

半程阴影

由晨风&Neverwind提出

阴影Setup阶段:

if 启用半程阴影:
{
	额外进行一次CreatePerObjectProjectedShadow()
	{
		处理阴影光照Matrix                //猜测:
											 //在ProjectedShadowInfo->SetupPerObjectProjection()中调整FProjectedShadowInfo.TranslatedWorldToView。
											 //在LightSceneInfo->Proxy->GetPerObjectProjectedShadowInitializer(Bounds, ShadowInitializer)之后修改WorldTolight。
		向阴影信息写入IsHalfViewShadowFlag//猜测在FProjectedShadowInfo中添加判断Flag并且写入。
		用新的光源方向画Atlas             //猜测给带有对应Flog的DirectionLigh多创建一个对应的Atlas
	}
}

截图代码(半程阴影修改LightDirection逻辑)

if(PrimitiveSceneinfo->Proxy->IsToonDisableSelfShadow())
{
...
	for (int32 ViewIndex = 0; ViewIndex < Views.Num(); ViewIndex++)
	{
		const FViewInfo& View = Views[ViewIndex];
		const FMatrix& ViewMatrix = View.ShadowViewMatrices.GetViewMatrix()
		FVector LightDirection = Lightsceneinfo->Proxy- GetDirection();
		const FVector CameraDirection = ViewMatrix.GetColumn(2).GetSafeNonmal()
		float LightViewBlendFactor = PrimitiveSceneinfo->Proxy->GetToonHalfVienShadowFactor();
		Fvector HalfViewLightDir = (LightDirection + ( 1 - LightViewBlendFactor) + CameraDirection * LightViewBlendFactor).GetSafeNormal();
		FMatrix FinalCombineMatrix = FNnverseRotationMatrix(HalfViewLightDir.Rotation())
		ShadowInitializer.WorldTolight = FinalCombineMatrix;
	}
...
 }

PS.很有可能需要创建2个Atlas。Atlas的创建位于FSceneRenderer::AllocateCachedShadowDepthTargets()。数据存储在SortedShadowsForShadowDepthPass.ShadowMapAtlases中。大致由FSceneRenderer::FinishInitDynamicShadows()调用。

阴影Projection阶段: //此阶段需要屏蔽角色投射到自己的非半程阴影 //和角色投射到场景中会跟随视角移动的阴影

if(Toon材质,且没有半程阴影Flag的阴影
&&Toon材质但有半程阴影Flag的阴影)
{
	屏蔽此阴影
}

PS.很有可能在FProjectedShadowInfo::RenderProjection()阶段进行判断以此保证合成正确的ScreenShadowMask