Top > エンジン改造-Gバッファの拡張

UE4.15.1で検証

参考

メモ

  • MaxSimultaneousRenderTargets = 8 で制限されてる
  • Scene Textureの「Shading Model」バッファもDistributionビルドで使えるっぽい。

MRT[0] - 計算済みカラー(多分)
MRT[1] - rgb - 法線, a - PerObjectGBufferData(0x01 - DistanceFieldを受けるか、0x02 - DynamicIndirectShadowCaster受けるか)(多分)
MRT[2] - r - Metalic, g - Specular, b - roughness, a - ShadingModelやSelectiveOutputMask(GetSelectiveOutputMask)
MRT[3] - rgb - ベースカラー, a - EncodeIndirectIrradiance or AO
#if GBUFFER_HAS_VELOCITY
 MRT[4] - Velocity
 MRT[5] - CustomData(※1)
 #if GBUFFER_HAS_PRECSHADOWFACTOR
  MRT[6] - PrecomputedShadowFactors
 #else
  MRT[6] - 空き
 #endif
#else
 MRT[4] - CustomData(※1)
 #if GBUFFER_HAS_PRECSHADOWFACTOR
  MRT[5] - PrecomputedShadowFactors
 #else
  MRT[5] - 空き
 #endif
 MRT[6] - 空き
#endif

※1 SUBSURFACE, PREINTEGRATED_SKIN, SUBSURFACE_PROFILE, CLEAR_COAT, TWOSIDED_FOLIAGE, HAIR, CLOTH, EYE のShading Modelの時のみ使用される
 → WRITES_CUSTOMDATA_TO_GBUFFERがtrueの場合のみ使用される
 → 独自Shading Modelでも使用できる

やってみた

  1. Engine\Source\Runtime\Renderer\Private\PostProcess\SceneRenderTargets.h
    1. BEGIN_UNIFORM_BUFFER_STRUCT(FGBufferResourceStruct, )
      の中
      1.  
         
        
         DECLARE_UNIFORM_BUFFER_STRUCT_MEMBER_TEXTURE( Texture2D,            GBufferVelocityTexture )
        の下に追加分
         
        
         DECLARE_UNIFORM_BUFFER_STRUCT_MEMBER_TEXTURE(Texture2D,                GBufferCellATexture)
      2.  
         
        
         DECLARE_UNIFORM_BUFFER_STRUCT_MEMBER_TEXTURE( Texture2D<float4>,    GBufferVelocityTextureNonMS )
        の下に追加分
         
        
         DECLARE_UNIFORM_BUFFER_STRUCT_MEMBER_TEXTURE( Texture2D<float4>,    GBufferCellATextureNonMS )
      3.  
         
        
         DECLARE_UNIFORM_BUFFER_STRUCT_MEMBER_TEXTURE( Texture2DMS<float4>,    GBufferVelocityTextureMS )
        の下に追加分
         
        
         DECLARE_UNIFORM_BUFFER_STRUCT_MEMBER_TEXTURE( Texture2DMS<float4>,    GBufferCellATextureMS )
      4.  
         
        
         DECLARE_UNIFORM_BUFFER_STRUCT_MEMBER_SAMPLER( SamplerState,            GBufferVelocityTextureSampler)
        の下に追加分
         
        
         DECLARE_UNIFORM_BUFFER_STRUCT_MEMBER_SAMPLER( SamplerState,            GBufferCellATextureSampler )
    2. class RENDERER_API FSceneRenderTargets
      1.  
         
        
         const FTexture2DRHIRef& GetGBufferVelocityTexture() const { return (const FTexture2DRHIRef&)GBufferVelocity->GetRenderTargetItem().ShaderResourceTexture; }
        の下に追加分
         
        
         const FTexture2DRHIRef& GetGBufferCellATexture() const { return (const FTexture2DRHIRef&)GBufferCellA->GetRenderTargetItem().ShaderResourceTexture; }
      2.  
         
        
         TRefCountPtr<IPooledRenderTarget> GBufferVelocity;
        の下に追加分
         
        
         TRefCountPtr<IPooledRenderTarget> GBufferCellA;
  2. Engine\Source\Runtime\Renderer\Private\PostProcess\SceneRenderTargets.cpp
    1. FSceneRenderTargets::FSceneRenderTargets
       
      
       , GBufferVelocity(GRenderTargetPool.MakeSnapshot(SnapshotSource.GBufferVelocity))
      の下に追加
       
      
       , GBufferCellA(GRenderTargetPool.MakeSnapshot(SnapshotSource.GBufferCellA))
    2. int32 FSceneRenderTargets::GetGBufferRenderTargets
      の末尾に追加。MRTにGバッファを追加する
       
      
       OutRenderTargets[MRTCount++] = FRHIRenderTargetView(GBufferCellA->GetRenderTargetItem().TargetableTexture, 0, -1, ColorLoadAction, ERenderTargetStoreAction::EStore);
    3. FSceneRenderTargets::ReleaseGBufferTargets
      の末尾に追加。
       
      
       GBufferCellA.SafeRelease();
    4. void FSceneRenderTargets::AllocGBufferTargets
      1.  
         
        -
        
         if (bUseGBuffer)
         {
        の中に追加分
         
         
        
         FPooledRenderTargetDesc CellRTDesc(FPooledRenderTargetDesc::Create2DDesc(BufferSize, PF_B8G8R8A8, FClearValueBinding::Transparent, TexCreate_None, TexCreate_RenderTargetable, false));
         GRenderTargetPool.FindFreeElement(RHICmdList, CellRTDesc, GBufferCellA, TEXT("GBufferCellA"));
      2.  
         
        -
        
         if (bCanReadGBufferUniforms)
         {
        の中に追加分
         
        
         const FSceneRenderTargetItem& GBufferVelocityToUse = GBufferVelocity ? GBufferVelocity->GetRenderTargetItem() : GSystemTextures.BlackDummy->GetRenderTargetItem();
        の下
         
        
         const FSceneRenderTargetItem& GBufferCellAToUse = GBufferCellA ? GBufferCellA->GetRenderTargetItem() : GSystemTextures.BlackDummy->GetRenderTargetItem();
      3.  
         
        
         GBufferResourceStruct.GBufferVelocityTexture = GBufferVelocityToUse.ShaderResourceTexture;
        の下
         
        
         GBufferResourceStruct.GBufferCellATexture = GBufferCellAToUse.ShaderResourceTexture;
      4.  
         
        
         GBufferResourceStruct.GBufferVelocityTextureNonMS = GBufferVelocityToUse.ShaderResourceTexture;
        の下
         
        
         GBufferResourceStruct.GBufferCellATextureNonMS = GBufferCellAToUse.ShaderResourceTexture;
      5.  
         
        
         GBufferResourceStruct.GBufferVelocityTextureMS = GBufferVelocityToUse.TargetableTexture;
        の下
         
        
         GBufferResourceStruct.GBufferCellATextureMS = GBufferCellAToUse.TargetableTexture;
      6.  
         
        
         GBufferResourceStruct.GBufferVelocityTextureSampler = TStaticSamplerState<>::GetRHI();
        の下
         
        
         GBufferResourceStruct.GBufferCellATextureSampler = TStaticSamplerState<>::GetRHI();
  3. Engine\Shaders\DeferredShadingCommon.usf
    1. struct FGBufferData
       
      
       float4 Velocity;
      の下に追加分のGバッファを追加
       
      
       float4 CellA;
    2. void EncodeGBuffer(...) Gバッファからの読み込み
      の引数に追加分のGバッファ引数を追加。
       
      
       out float4 OutGBufferCellA,
      関数の末尾にGバッファ構造体から出力を追加
       
      
       OutGBufferCellA = GBuffer.CellA;
    3. DecodeGBufferData(...) Gバッファへ書き込み
      の引数に追加分のGバッファ引数を追加
       
      
       float4 InGBufferCellA,
      関数の末尾にGバッファ構造体へ値を代入
       
      
       GBuffer.CellA = InGBufferCellA;
    4. FGBufferData GetGBufferDataUint
       
      
       float4 GBufferD = GBuffers.GBufferDTextureNonMS.Load(int3(PixelPos, 0));
      の下に追加。Gバッファのテクスチャの読み込み。DecodeGBufferDataに流し込む。
       
      
       float4 GBufferCellA = GBuffers.GBufferCellATextureNonMS.Load(int3(PixelPos, 0));
    5. FGBufferData GetGBufferData
       
      
       float4 GBufferD = Texture2DSampleLevel(GBuffers.GBufferDTexture, GBuffers.GBufferDTextureSampler, UV, 0);
      の下に追加。Gバッファのテクスチャの読み込み。DecodeGBufferDataに流し込む。
       
      
       float4 GBufferCellA = Texture2DSampleLevel(GBuffers.GBufferCellATexture, GBuffers.GBufferCellATextureSampler, UV, 0);
    6. FGBufferData GetGBufferDataMS
       
      
       float4 GBufferD = GBuffers.GBufferDTextureMS.Load(PixelPos, SampleIndex);
      の下に追加。Gバッファのテクスチャの読み込み。DecodeGBufferDataに流し込む。
       
      
       float4 GBufferCellA = GBuffers.GBufferCellATextureMS.Load(PixelPos, SampleIndex);
    7. float3 GetShadingModelColor
      デバッグ用のShadingModelのカラー表示。
       
      
       case SHADINGMODELID_EYE: return float3(0.3f, 1.0f, 1.0f);
      の下に追加
    8. 各所EncodeGBuffer, DecodeGBufferDataを使っている所の引数を追加する。
  4. 初期化や引数を追加
    1. Engine\Shaders\DecalCommon.usf
       
      
       EncodeGBuffer
      に渡す引数
    2. Engine\Shaders\DeferredDecal.usf
       
      
       DecalCommonOutput
      に渡す GBufferData の初期化
    3. Engine\Shaders\MeshDecals.usf
       
      
       DecalCommonOutput
      に渡す GBufferData の初期化
  5. Engine\Shaders\BasePassPixelShader.usf
    1. FPixelShaderInOut_MainPS
       
      
       #if USES_GBUFFER
      に囲まれている
       
      
       Out.MRT[]
      の追加分の要素に出力したい値を入れる
    2. PIXELSHADEROUTPUT_MRT*
      追加した分のGバッファを使用するか定義を追加
      1.  
         
        
         #if GBUFFER_HAS_VELOCITY
        内に
         
        
         #define PIXELSHADEROUTPUT_MRT7 (USES_GBUFFER && (!SELECTIVE_BASEPASS_OUTPUTS || !MATERIAL_SHADINGMODEL_UNLIT))
      2.  
         
        
         #else //WRITES_VELOCITY_TO_GBUFFER
        
        内に
         
         
        
         #define PIXELSHADEROUTPUT_MRT6 (USES_GBUFFER && (!SELECTIVE_BASEPASS_OUTPUTS || !MATERIAL_SHADINGMODEL_UNLIT))
         #define PIXELSHADEROUTPUT_MRT7 (USES_GBUFFER && (!SELECTIVE_BASEPASS_OUTPUTS || !MATERIAL_SHADINGMODEL_UNLIT))
  6. PostProcessMaterialのSceneTextureにGバッファを追加する
    1. Engine\Shaders\MaterialTemplate.usf
      1. SceneTextureLookup
        PPI_StoredSpecular の後に追加したGバッファ分を追記
         
         
        
         // PPI_CellA
         case 27: return ScreenSpaceData.GBuffer.CellA;
    2. Engine\Source\Runtime\Engine\Classes\Materials\MaterialExpressionSceneTexture.h
       
      
       PPI_StoredSpecular UMETA(DisplayName="Specular (as stored in GBuffer)"),
      の下に追加したGバッファ分を追記
       
      
       PPI_CellA UMETA(DisplayName="CellA (as stored in GBuffer)"),
  7. Engine\Source\Runtime\Engine\Private\Materials\HLSLMaterialTranslator.h
    1. void UseSceneTextureId(...)
       
      
       const bool bNeedsGBuffer = SceneTextureId == PPI_DiffuseColor
      にGバッファ追加分を追加
       
      
       || SceneTextureId == PPI_CellA

リロード   新規 編集 凍結 差分 添付 複製 名前変更   ホーム 一覧 単語検索 最終更新 バックアップ リンク元   ヘルプ   最終更新のRSS
Last-modified: 2017-04-09 (日) 19:27:14 (2566d)