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