Top > エンジン改造-ライティング解析

UE4.15.1で検証

参考

レンダリングの流れ

Deferred Shaing

  • 動的影生成
    Main (ShadowProjectionPixelShader.usf)
  • GBufferへの書き込み
    MainPS (PixelShaderOutputCommon.usf)
     FPixelShaderInOut_MainPS (BasePassPixelShader.usf)
    • Indirect Light、Sky Lightの計算
      GetPrecomputedIndirectLightingAndSkyLight (BasePassPixelShader.usf)
      • Sky Lightの計算
        GetSkyLighting (BasePassPixelShader.usf)
  • Gバッファからシェーディング
    DirectionalPixelMain (DeferredLightPixelShaders.usf)
    • 動的ライトの計算。キャストシャドウもここで合成
      GetDynamicLighting (DeferredLightingCommon.usf)
      • シェーディングの計算
        SurfaceShading (ShadingModels.usf)

Forward Shading

  • シェーディング
    FPixelShaderInOut_MainPS (BasePassPixelShaders.usf)
    • ライトの数だけ回して計算する
      GetForwardDirectLighting (ForwardLightingCommon.usf)
      • GBuffer構造体への書き込みをしてDeferredと同じ処理を回せるようにしている
      • 動的ライトの計算。キャストシャドウもここで合成
        GetDynamicLighting (DeferredLightingCommon.usf)

https://twitter.com/com04/status/877511284354277381

動的影生成

メモ

Shadow変数が影の強さ。0.0 - 影
→FadedShadow変数フェード付き
→OutColor変数に最終出力。
OutColor.r値のみ参照されているっぽい。
MODULATED_SHADOWSがmobile時のみ使える?
Engine\Source\Runtime\Renderer\Private\ShadowRendering.cpp
https://docs.unrealengine.com/latest/JPN/Platforms/Mobile/Lighting/HowTo/ModulatedShadows/index.html

  • 描画元
    FDeferredShadingSceneRenderer::RenderLights (Engine\Source\Runtime\Renderer\Private\LightRendering.cpp)
     FDeferredShadingSceneRenderer::RenderShadowProjections (Engine\Source\Runtime\Renderer\Private\ShadowRendering.cpp)
      FSceneRenderer::RenderShadowProjections (Engine\Source\Runtime\Renderer\Private\ShadowRendering.cpp)
  • モバイル用
    FMobileSceneRenderer::Render (Engine\Source\Runtime\Renderer\Private\MobileShadingRenderer.cpp)
     FMobileSceneRenderer::RenderModulatedShadowProjections (Engine\Source\Runtime\Renderer\Private\ShadowRendering.cpp)
      FSceneRenderer::RenderShadowProjections (Engine\Source\Runtime\Renderer\Private\ShadowRendering.cpp)

Indirect Light、Sky Lightの計算 - GetPrecomputedIndirectLightingAndSkyLight

  • (BasePassPixelShader.usf)
    GBufferのMRT[0]に書き出される

動的ライト、キャストシャドウの計算 - GetDynamicLighting

  • (DeferredLightingCommon.usf)
    記述が無い場合は下記設定でスクリーンショット
  • マテリアル
    • BaseColor : 1.0, 1.0, 1.0
    • Metalic : 0.0
    • Roughtness 1.0
    • Specular : 0.5
  • ライト
    • ディフューズライト1灯のみ
    • Intencity : 6.0
    • Color : 0.0, 1.0, 0.0

基本パラメーター

  • Default Lit
    Rendering-DefaultLit.png
  • GBuffer.DiffuseColor
    Rendering-GBuffer.DeffuseColor.png
  • GBuffer.SpecularColor
    Rendering-GBuffer.SpecularColor.png
  • LightColor
    Rendering-LightColor.png

ライティングフロー

SurfaceShading
 ↓
LightAccumulator_Add

キャストシャドウ

SurfaceShadow変数に格納。SurfaceAttenuation変数に受け継がれる。
1.0で影無し。

SurfaceLighting

 
float3 SurfaceLighting = SurfaceShading(GBuffer, LobeRoughness, LobeEnergy, L, V, N, Random);

Rendering-SurfaceLighting.png

  • SurfaceShadingの中身
     
    -
    |
    |
    |
    |
    |
    |
    |
    |
    |
    |
    |
    |
    |
    |
    |
    |
    !
    
    float3 StandardShading( float3 DiffuseColor, float3 SpecularColor, float3 LobeRoughness, float3 LobeEnergy, float3 L, float3 V, half3 N )
    {
        float3 H = normalize(V + L);
        float NoL = saturate( dot(N, L) );
        float NoV = saturate( abs( dot(N, V) ) + 1e-5 );
        float NoH = saturate( dot(N, H) );
        float VoH = saturate( dot(V, H) );
        
        // Generalized microfacet specular
        float D = D_GGX( LobeRoughness[1], NoH ) * LobeEnergy[1];
        float Vis = Vis_SmithJointApprox( LobeRoughness[1], NoV, NoL );
        float3 F = F_Schlick( SpecularColor, VoH );
     
        float3 Diffuse = Diffuse_Lambert( DiffuseColor );
        //float3 Diffuse = Diffuse_Burley( DiffuseColor, LobeRoughness[1], NoV, NoL, VoH );
        //float3 Diffuse = Diffuse_OrenNayar( DiffuseColor, LobeRoughness[1], NoV, NoL, VoH );
     
        return Diffuse * LobeEnergy[2] + (D * Vis) * F;
    }
    1. Diffuse * LobeEnergy[2] = x
      Rendering-SurfaceLighting-Diffuse.png * Rendering-SurfaceLighting-LobeEnegy[2].png = Rendering-SurfaceLighting-Diffuse-x-LobeEnegy[2].png
    2. (D * Vis) * F = y
      (Rendering-SurfaceLighting-D(Roughness_1.0).png * Rendering-SurfaceLighting-Vis(Roughness_1.0).png ) * Rendering-SurfaceLighting-F.png = Rendering-SurfaceLighting-(D-x-Vis)-x-F.png
    3. x + y = return
      Rendering-SurfaceLighting-Diffuse-x-LobeEnegy[2].png + Rendering-SurfaceLighting-(D-x-Vis)-x-F.png = Rendering-SurfaceLighting.png

  • Roughness = 0.0の時
  1. Diffuse * LobeEnergy[2] = x
    Rendering-SurfaceLighting-Diffuse.png * Rendering-SurfaceLighting-LobeEnegy[2](Roughness_0.0).png = Rendering-SurfaceLighting-Diffuse-x-LobeEnegy[2](Roughness_0.0).png
  2. (D * Vis) * F = y
    (Rendering-SurfaceLighting-D(Roughness_0.0).png * Rendering-SurfaceLighting-Vis(Roughness_0.0).png ) * Rendering-SurfaceLighting-F.png = Rendering-SurfaceLighting-(D-x-Vis)-x-F(Roughtness_0.0).png
  3. x + y = return
    Rendering-SurfaceLighting-Diffuse-x-LobeEnegy[2](Roughness_0.0).png + Rendering-SurfaceLighting-(D-x-Vis)-x-F(Roughtness_0.0).png = Rendering-SurfaceLighting(Roughness_0.0).png
  • マテリアルのBaseColorを調整してみるとSurface Lightingにスペキュラが入っているのが確認できる
    Rendering-SurfaceLighting-Roughness_0.0_Adjust.png

ライトカラーとの合成

 
LightAccumulator_Add(LightAccumulator, SurfaceLighting, (1.0/PI), LightColor * (NoL * SurfaceAttenuation), bNeedsSeparateSubsurfaceLightAccumulation);
  • (NoL * SurfaceAttenuation) =
    Rendering-NoL.png * Rendering-SurfaceAttenuation.png = Rendering-NoL-x-SurfaceAttenuation.png
  • LightColor * (NoL * SurfaceAttenuation) = x
    Rendering-LightColor.png * Rendering-NoL-x-SurfaceAttenuation.png = Rendering-LightColor-x-(NoL-x-SurfaceAttenuation).png
  • SurfaceLighting * x =
    Rendering-SurfaceLighting.png * Rendering-LightColor-x-(NoL-x-SurfaceAttenuation).png = Rendering-GetDynamicLighting.png

  • Roughness = 0.0の時
  1. SurfaceLighting * x =
    Rendering-SurfaceLighting(Roughness_0.0).png * Rendering-LightColor-x-(NoL-x-SurfaceAttenuation).png = Rendering-GetDynamicLighting(Roughness_0.0).png

添付ファイル: fileRendering-GetDynamicLighting(Roughness_0.0).png 95件 [詳細] fileRendering-GetDynamicLighting.png 89件 [詳細] fileRendering-SurfaceLighting-Roughness_0.0_Adjust.png 86件 [詳細] fileRendering-SurfaceLighting-(D-x-Vis)-x-F(Roughtness_0.0).png 94件 [詳細] fileRendering-SurfaceLighting-Diffuse-x-LobeEnegy[2](Roughness_0.0).png 100件 [詳細] fileRendering-SurfaceLighting-LobeEnegy[2](Roughness_0.0).png 99件 [詳細] fileRendering-SurfaceLighting(Roughness_0.0).png 101件 [詳細] fileRendering-SurfaceLighting-F.png 84件 [詳細] fileRendering-SurfaceLighting-Diffuse-x-LobeEnegy[2].png 91件 [詳細] fileRendering-SurfaceLighting-Diffuse.png 92件 [詳細] fileRendering-SurfaceLighting-Vis(Roughness_1.0).png 90件 [詳細] fileRendering-SurfaceLighting-Vis(Roughness_0.0).png 92件 [詳細] fileRendering-SurfaceLighting-LobeEnegy[2].png 95件 [詳細] fileRendering-SurfaceLighting-D(Roughness_1.0).png 89件 [詳細] fileRendering-SurfaceLighting-D(Roughness_0.0).png 81件 [詳細] fileRendering-SurfaceLighting.png 95件 [詳細] fileRendering-SurfaceLighting-(D-x-Vis)-x-F.png 95件 [詳細] fileRendering-SurfaceAttenuation.png 94件 [詳細] fileRendering-NoL-x-SurfaceAttenuation.png 89件 [詳細] fileRendering-NoL.png 92件 [詳細] fileRendering-LightColor-x-(NoL-x-SurfaceAttenuation).png 85件 [詳細] fileRendering-LightColor.png 94件 [詳細] fileRendering-GBuffer.SpecularColor.png 97件 [詳細] fileRendering-GBuffer.DeffuseColor.png 88件 [詳細] fileRendering-DefaultLit.png 89件 [詳細]

リロード   新規 編集 凍結 差分 添付 複製 名前変更   ホーム 一覧 単語検索 最終更新 バックアップ リンク元   ヘルプ   最終更新のRSS
Last-modified: 2017-06-21 (水) 22:11:50 (790d)