UE5: Bend Studio版Screen-Space-Shadowsによる最適化
公開日: 2026/01/29
Screen-Space-Shadowsとは
Section titled “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』でも同様の技術が確認できます。
※ゲーム内オプションより確認済みです。
WinterCrownWORKS: Screen-Space-Shadows
Section titled “WinterCrownWORKS: Screen-Space-Shadows”遠景影の運用
Section titled “遠景影の運用”DynamicShadowDistanceを短くすることでShadowDepthsの負荷を削減できます。 DistanceFieldShadowも最低限のものだけ有効化することでDistanceFieldShadowの負荷も減らします。
Screen-Space-Shadows
Section titled “Screen-Space-Shadows”
※中央のバーを左右にドラッグすることで画像を比較できます。
Screen-Space-Shadows
Section titled “Screen-Space-Shadows”
CascadeShadowMapの解像度を確保する
Section titled “CascadeShadowMapの解像度を確保する”DynamicShadowの範囲を絞ることで距離に対して割り当てられる解像度が増え、結果的に近場の品質を上げることにつながります。
Dynamic Shadow Distance
Section titled “Dynamic Shadow Distance”
Dynamic Shadow Distance
Section titled “Dynamic Shadow Distance”
Characterへのディティール追加
Section titled “Characterへのディティール追加”Bend Studio版のScreen-Space-Shadowsは長く詳細な影がつきやすく、ちょっとした凹凸の情報から影のディティールを追加してくれます
Screen-Space-Shadows
Section titled “Screen-Space-Shadows”
DepthOffsetと組み合わせたディティール表現
Section titled “DepthOffsetと組み合わせたディティール表現”UnrealEngine上でこれを行うためにはDepthOffsetを改造するか、PixelDepthOffsetを利用するしかありません。
WinterCrownWORKSではPixelDepthOffsetで発生するDepthModificationによるLateZ/PostZの負荷を避けるため、DepthOffsetをエンジン改造で導入しました。
※GBuffer拡張によるDepthOffset値の出力とPostProcessによる深度のバイアス処理を追加しました。
DepthOffset
Section titled “DepthOffset”
DepthOffset
Section titled “DepthOffset”
WinterCrownWORKS : Depth Offset Detail
Section titled “WinterCrownWORKS : Depth Offset Detail”Renderdoc:DepthOffset
Section titled “Renderdoc:DepthOffset”Offset前の深度
Section titled “Offset前の深度”
OffsetのGBuffer
Section titled “OffsetのGBuffer”
Offset後の深度
Section titled “Offset後の深度”
機能を使用するために
Section titled “機能を使用するために”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様に深く感謝させていただきます。