Top > エンジン改造-Gバッファの拡張
#contents ---- UE4.15.1で検証 * 参考 [#m299e3f7] - [UE4] GBufferを拡張する - もんしょの巣穴 http://monsho.blog63.fc2.com/blog-entry-191.html * メモ [#wd54c572] - MaxSimultaneousRenderTargets = 8 で制限されてる - Scene Textureの「Shading Model」バッファもDistributionビルドで使えるっぽい。 COLOR(#c03030){MRT[0]} - 計算済みカラー(多分) COLOR(#c03030){MRT[1]} - rgb - 法線, a - PerObjectGBufferData(0x01 - DistanceFieldを受けるか、0x02 - DynamicIndirectShadowCaster受けるか)(多分) COLOR(#c03030){MRT[2]} - r - Metalic, g - Specular, b - roughness, a - ShadingModelやSelectiveOutputMask(GetSelectiveOutputMask) COLOR(#c03030){MRT[3]} - rgb - ベースカラー, a - EncodeIndirectIrradiance or AO COLOR(#0000c0){#if GBUFFER_HAS_VELOCITY} COLOR(#c03030){MRT[4]} - Velocity COLOR(#c03030){MRT[5]} - CustomData(※1) COLOR(#0000c0){#if GBUFFER_HAS_PRECSHADOWFACTOR} COLOR(#c03030){MRT[6]} - PrecomputedShadowFactors COLOR(#0000c0){#else} COLOR(#c03030){MRT[6]} - 空き COLOR(#0000c0){#endif} COLOR(#0000c0){#else} COLOR(#c03030){MRT[4]} - CustomData(※1) COLOR(#0000c0){#if GBUFFER_HAS_PRECSHADOWFACTOR} COLOR(#c03030){MRT[5]} - PrecomputedShadowFactors COLOR(#0000c0){#else} COLOR(#c03030){MRT[5]} - 空き COLOR(#0000c0){#endif} COLOR(#c03030){MRT[6]} - 空き COLOR(#0000c0){#endif} ※1 SUBSURFACE, PREINTEGRATED_SKIN, SUBSURFACE_PROFILE, CLEAR_COAT, TWOSIDED_FOLIAGE, HAIR, CLOTH, EYE のShading Modelの時のみ使用される → WRITES_CUSTOMDATA_TO_GBUFFERがtrueの場合のみ使用される → 独自Shading Modelでも使用できる - 「Shading Model」バッファもDistributionビルドで使えるっぽい。 * やってみた [#r6c702ae] + Engine\Source\Runtime\Renderer\Private\PostProcess\SceneRenderTargets.h ++ BEGIN_UNIFORM_BUFFER_STRUCT(FGBufferResourceStruct, ) の中 +++ #code(C,nonumber,nomenu){{ DECLARE_UNIFORM_BUFFER_STRUCT_MEMBER_TEXTURE( Texture2D, GBufferVelocityTexture ) }} の下に追加分 #code(C,nonumber,nomenu){{ DECLARE_UNIFORM_BUFFER_STRUCT_MEMBER_TEXTURE(Texture2D, GBufferCellATexture) }} +++ #code(C,nonumber,nomenu){{ DECLARE_UNIFORM_BUFFER_STRUCT_MEMBER_TEXTURE( Texture2D<float4>, GBufferVelocityTextureNonMS ) }} の下に追加分 #code(C,nonumber,nomenu){{ DECLARE_UNIFORM_BUFFER_STRUCT_MEMBER_TEXTURE( Texture2D<float4>, GBufferCellATextureNonMS ) }} +++ #code(C,nonumber,nomenu){{ DECLARE_UNIFORM_BUFFER_STRUCT_MEMBER_TEXTURE( Texture2DMS<float4>, GBufferVelocityTextureMS ) }} の下に追加分 #code(C,nonumber,nomenu){{ DECLARE_UNIFORM_BUFFER_STRUCT_MEMBER_TEXTURE( Texture2DMS<float4>, GBufferCellATextureMS ) }} +++ #code(C,nonumber,nomenu){{ DECLARE_UNIFORM_BUFFER_STRUCT_MEMBER_SAMPLER( SamplerState, GBufferVelocityTextureSampler) }} の下に追加分 #code(C,nonumber,nomenu){{ DECLARE_UNIFORM_BUFFER_STRUCT_MEMBER_SAMPLER( SamplerState, GBufferCellATextureSampler ) }} ++ class RENDERER_API FSceneRenderTargets +++ #code(C,nonumber,nomenu){{ const FTexture2DRHIRef& GetGBufferVelocityTexture() const { return (const FTexture2DRHIRef&)GBufferVelocity->GetRenderTargetItem().ShaderResourceTexture; } }} の下に追加分 #code(C,nonumber,nomenu){{ const FTexture2DRHIRef& GetGBufferCellATexture() const { return (const FTexture2DRHIRef&)GBufferCellA->GetRenderTargetItem().ShaderResourceTexture; } }} +++ #code(C,nonumber,nomenu){{ TRefCountPtr<IPooledRenderTarget> GBufferVelocity; }} の下に追加分 #code(C,nonumber,nomenu){{ TRefCountPtr<IPooledRenderTarget> GBufferCellA; }} + Engine\Source\Runtime\Renderer\Private\PostProcess\SceneRenderTargets.cpp ++ FSceneRenderTargets::FSceneRenderTargets #code(C,nonumber,nomenu){{ , GBufferVelocity(GRenderTargetPool.MakeSnapshot(SnapshotSource.GBufferVelocity)) }} の下に追加 #code(C,nonumber,nomenu){{ , GBufferCellA(GRenderTargetPool.MakeSnapshot(SnapshotSource.GBufferCellA)) }} ++ int32 FSceneRenderTargets::GetGBufferRenderTargets の末尾に追加。MRTにGバッファを追加する #code(C,nonumber,nomenu){{ OutRenderTargets[MRTCount++] = FRHIRenderTargetView(GBufferCellA->GetRenderTargetItem().TargetableTexture, 0, -1, ColorLoadAction, ERenderTargetStoreAction::EStore); }} ++ FSceneRenderTargets::ReleaseGBufferTargets の末尾に追加。 #code(C,nonumber,nomenu){{ GBufferCellA.SafeRelease(); }} ++ void FSceneRenderTargets::AllocGBufferTargets +++ #code(C,nonumber,nomenu){{ if (bUseGBuffer) { }} の中に追加分 #code(C,nonumber,nomenu){{ FPooledRenderTargetDesc CellRTDesc(FPooledRenderTargetDesc::Create2DDesc(BufferSize, PF_B8G8R8A8, FClearValueBinding::Transparent, TexCreate_None, TexCreate_RenderTargetable, false)); GRenderTargetPool.FindFreeElement(RHICmdList, CellRTDesc, GBufferCellA, TEXT("GBufferCellA")); }} +++ #code(C,nonumber,nomenu){{ if (bCanReadGBufferUniforms) { }} の中に追加分 #code(C,nonumber,nomenu){{ const FSceneRenderTargetItem& GBufferVelocityToUse = GBufferVelocity ? GBufferVelocity->GetRenderTargetItem() : GSystemTextures.BlackDummy->GetRenderTargetItem(); }} の下 #code(C,nonumber,nomenu){{ const FSceneRenderTargetItem& GBufferCellAToUse = GBufferCellA ? GBufferCellA->GetRenderTargetItem() : GSystemTextures.BlackDummy->GetRenderTargetItem(); }} +++ #code(C,nonumber,nomenu){{ GBufferResourceStruct.GBufferVelocityTexture = GBufferVelocityToUse.ShaderResourceTexture; }} の下 #code(C,nonumber,nomenu){{ GBufferResourceStruct.GBufferCellATexture = GBufferCellAToUse.ShaderResourceTexture; }} +++ #code(C,nonumber,nomenu){{ GBufferResourceStruct.GBufferVelocityTextureNonMS = GBufferVelocityToUse.ShaderResourceTexture; }} の下 #code(C,nonumber,nomenu){{ GBufferResourceStruct.GBufferCellATextureNonMS = GBufferCellAToUse.ShaderResourceTexture; }} +++ #code(C,nonumber,nomenu){{ GBufferResourceStruct.GBufferVelocityTextureMS = GBufferVelocityToUse.TargetableTexture; }} の下 #code(C,nonumber,nomenu){{ GBufferResourceStruct.GBufferCellATextureMS = GBufferCellAToUse.TargetableTexture; }} +++ #code(C,nonumber,nomenu){{ GBufferResourceStruct.GBufferVelocityTextureSampler = TStaticSamplerState<>::GetRHI(); }} の下 #code(C,nonumber,nomenu){{ GBufferResourceStruct.GBufferCellATextureSampler = TStaticSamplerState<>::GetRHI(); }} + Engine\Shaders\DeferredShadingCommon.usf ++ struct FGBufferData #code(C,nonumber,nomenu){{ float4 Velocity; }} の下に追加分のGバッファを追加 #code(C,nonumber,nomenu){{ float4 CellA; }} ++ void EncodeGBuffer(...) Gバッファからの読み込み の引数に追加分のGバッファ引数を追加。 #code(C,nonumber,nomenu){{ out float4 OutGBufferCellA, }} 関数の末尾にGバッファ構造体から出力を追加 #code(C,nonumber,nomenu){{ OutGBufferCellA = GBuffer.CellA; }} ++ DecodeGBufferData(...) Gバッファへ書き込み の引数に追加分のGバッファ引数を追加 #code(C,nonumber,nomenu){{ float4 InGBufferCellA, }} 関数の末尾にGバッファ構造体へ値を代入 #code(C,nonumber,nomenu){{ GBuffer.CellA = InGBufferCellA; }} ++ FGBufferData GetGBufferDataUint #code(C,nonumber,nomenu){{ float4 GBufferD = GBuffers.GBufferDTextureNonMS.Load(int3(PixelPos, 0)); }} の下に追加。Gバッファのテクスチャの読み込み。DecodeGBufferDataに流し込む。 #code(C,nonumber,nomenu){{ float4 GBufferCellA = GBuffers.GBufferCellATextureNonMS.Load(int3(PixelPos, 0)); }} ++ FGBufferData GetGBufferData #code(C,nonumber,nomenu){{ float4 GBufferD = Texture2DSampleLevel(GBuffers.GBufferDTexture, GBuffers.GBufferDTextureSampler, UV, 0); }} の下に追加。Gバッファのテクスチャの読み込み。DecodeGBufferDataに流し込む。 #code(C,nonumber,nomenu){{ float4 GBufferCellA = Texture2DSampleLevel(GBuffers.GBufferCellATexture, GBuffers.GBufferCellATextureSampler, UV, 0); }} ++ FGBufferData GetGBufferDataMS #code(C,nonumber,nomenu){{ float4 GBufferD = GBuffers.GBufferDTextureMS.Load(PixelPos, SampleIndex); }} の下に追加。Gバッファのテクスチャの読み込み。DecodeGBufferDataに流し込む。 #code(C,nonumber,nomenu){{ float4 GBufferCellA = GBuffers.GBufferCellATextureMS.Load(PixelPos, SampleIndex); }} ++ float3 GetShadingModelColor デバッグ用のShadingModelのカラー表示。 #code(C,nonumber,nomenu){{ case SHADINGMODELID_EYE: return float3(0.3f, 1.0f, 1.0f); }} の下に追加 ++ 各所EncodeGBuffer, DecodeGBufferDataを使っている所の引数を追加する。 + 初期化や引数を追加 ++ Engine\Shaders\DecalCommon.usf #code(C,nonumber,nomenu){{ EncodeGBuffer }} に渡す引数 ++ Engine\Shaders\DeferredDecal.usf #code(C,nonumber,nomenu){{ DecalCommonOutput }} に渡す GBufferData の初期化 ++ Engine\Shaders\MeshDecals.usf #code(C,nonumber,nomenu){{ DecalCommonOutput }} に渡す GBufferData の初期化 + Engine\Shaders\BasePassPixelShader.usf ++ FPixelShaderInOut_MainPS #code(C,nonumber,nomenu){{ #if USES_GBUFFER }} に囲まれている #code(C,nonumber,nomenu){{ Out.MRT[] }} の追加分の要素に出力したい値を入れる ++ PIXELSHADEROUTPUT_MRT* 追加した分のGバッファを使用するか定義を追加 +++ #code(C,nonumber,nomenu){{ #if GBUFFER_HAS_VELOCITY }} 内に #code(C,nonumber,nomenu){{ #define PIXELSHADEROUTPUT_MRT7 (USES_GBUFFER && (!SELECTIVE_BASEPASS_OUTPUTS || !MATERIAL_SHADINGMODEL_UNLIT)) }} +++ #code(C,nonumber,nomenu){{ #else //WRITES_VELOCITY_TO_GBUFFER }} 内に #code(C,nonumber,nomenu){{ #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バッファ分を追記 #code(C,nonumber,nomenu){{ // PPI_CellA case 27: return ScreenSpaceData.GBuffer.CellA; }} ++ Engine\Source\Runtime\Engine\Classes\Materials\MaterialExpressionSceneTexture.h #code(C,nonumber,nomenu){{ PPI_StoredSpecular UMETA(DisplayName="Specular (as stored in GBuffer)"), }} の下に追加したGバッファ分を追記 #code(C,nonumber,nomenu){{ PPI_CellA UMETA(DisplayName="CellA (as stored in GBuffer)"), }} + Engine\Source\Runtime\Engine\Private\Materials\HLSLMaterialTranslator.h ++ void UseSceneTextureId(...) #code(C,nonumber,nomenu){{ const bool bNeedsGBuffer = SceneTextureId == PPI_DiffuseColor }} にGバッファ追加分を追加 #code(C,nonumber,nomenu){{ || SceneTextureId == PPI_CellA }} |