// Comment out this line コンテンツにスキップ
Winter Crown Works Logo Winter Crown Works Logo

UE5: Bend Studio版Screen-Space-Shadowsによる最適化

Screen-Space-Shadowsは画面内の情報からローカルなレイトレースを行うことでShadowMapへのレンダリングを行わずにShadowの計算を行う方法になります。 ShadowMapを生成しないことから大量のオブジェクトの影を計算しなければならないようなシーンで軽量に利用でき、その効果も非常に大きいです。 また応用することで、よりシーンにディティールを追加することが可能です。 今回ご紹介するのはUE5にインテグレートされているBend Studio製のScreen-Space -Shadowsの最適化と運用例についてです

Screen-Space-Shadowsの実装例としては、Bend Studio の『Days Gone』に加え、
Sucker Punch Productions の『Ghost of Tsushima』でも同様の技術が確認できます。
※ゲーム内オプションより確認済みです。

Play

DynamicShadowDistanceを短くすることでShadowDepthsの負荷を削減できます。 DistanceFieldShadowも最低限のものだけ有効化することでDistanceFieldShadowの負荷も減らします。

SS Shadows Disable SS Shadows Enable

※中央のバーを左右にドラッグすることで画像を比較できます。

SS Shadows Disable (Enlarge) SS Shadows Enable (Enlarge)

CascadeShadowMapの解像度を確保する

Section titled “CascadeShadowMapの解像度を確保する”

DynamicShadowの範囲を絞ることで距離に対して割り当てられる解像度が増え、結果的に近場の品質を上げることにつながります。

200 meter 100 meter
200 meter (Enlarge) 100 meter (Enlarge)

Bend Studio版のScreen-Space-Shadowsは長く詳細な影がつきやすく、ちょっとした凹凸の情報から影のディティールを追加してくれます

SS Shadows Disable (Character) SS Shadows Enable (Character)

DepthOffsetと組み合わせたディティール表現

Section titled “DepthOffsetと組み合わせたディティール表現”

UnrealEngine上でこれを行うためにはDepthOffsetを改造するか、PixelDepthOffsetを利用するしかありません。
WinterCrownWORKSではPixelDepthOffsetで発生するDepthModificationによるLateZ/PostZの負荷を避けるため、DepthOffsetをエンジン改造で導入しました。
※GBuffer拡張によるDepthOffset値の出力とPostProcessによる深度のバイアス処理を追加しました。

DepthOffset Disable DepthOffset Enable
DepthOffset Disable (Enlarge) DepthOffset Enable (Enlarge)
Play

DeskTopRender上で使うにはエンジンの一部を改造する必要があります。

// ... Engineコード
FDeferredShadingSceneRenderer::RenderDeferredShadowProjections(
      
      
      
const FVisibleLightInfo& VisibleLightInfo = VisibleLightInfos[LightSceneInfo->Id];
RenderCapsuleDirectShadows(
GraphBuilder,
*LightSceneInfo,
ScreenShadowMaskTexture,
VisibleLightInfo.CapsuleShadowsToProject,
bProjectingForForwardShading
);
// --- 追加箇所ここから ---
if (LightSceneInfo->Proxy &&
LightSceneInfo->Proxy->GetLightType() == LightType_Directional)
{
// Dynamic shadows are projected into channels of the light attenuation texture
// based on their assigned DynamicShadowMapChannel
// Only render screen space shadows if light is assigned to a valid DynamicShadowMapChannel
RenderScreenSpaceShadows(
GraphBuilder,
SceneTextures,
Views,
LightSceneInfo,
bProjectingForForwardShading,
ScreenShadowMaskTexture
);
}
// --- 追加箇所ここまで ---

ScreenSpace系の処理のため、画面端でアーティファクトを起こしやすいです。
これはContactShadowでも同様です。
また、深度のみを使っているため部分的なアーティファクトが発生することもあります。

担当されたR&D LeadのGraham Aldridge様、
カンファレンス情報を一般公開していただいたソニー様、Bend Studio様に深く感謝させていただきます。

Play