エンジン改造-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 - PerObjectGBuffer...
COLOR(#c03030){MRT[2]} - r - Metalic, g - Specular, b - r...
COLOR(#c03030){MRT[3]} - rgb - ベースカラー, a - EncodeIn...
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, CL...
→ WRITES_CUSTOMDATA_TO_GBUFFERがtrueの場合のみ使用される
→ 独自Shading Modelでも使用できる
* やってみた [#r6c702ae]
+ Engine\Source\Runtime\Renderer\Private\PostProcess\Scen...
++ BEGIN_UNIFORM_BUFFER_STRUCT(FGBufferResourceStruct, )
の中
+++
#code(C,nonumber,nomenu){{
DECLARE_UNIFORM_BUFFER_STRUCT_MEMBER_TEXTURE( Texture2D,...
}}
の下に追加分
#code(C,nonumber,nomenu){{
DECLARE_UNIFORM_BUFFER_STRUCT_MEMBER_TEXTURE(Texture2D, ...
}}
+++
#code(C,nonumber,nomenu){{
DECLARE_UNIFORM_BUFFER_STRUCT_MEMBER_TEXTURE( Texture2D<...
}}
の下に追加分
#code(C,nonumber,nomenu){{
DECLARE_UNIFORM_BUFFER_STRUCT_MEMBER_TEXTURE( Texture2D<...
}}
+++
#code(C,nonumber,nomenu){{
DECLARE_UNIFORM_BUFFER_STRUCT_MEMBER_TEXTURE( Texture2DM...
}}
の下に追加分
#code(C,nonumber,nomenu){{
DECLARE_UNIFORM_BUFFER_STRUCT_MEMBER_TEXTURE( Texture2DM...
}}
+++
#code(C,nonumber,nomenu){{
DECLARE_UNIFORM_BUFFER_STRUCT_MEMBER_SAMPLER( SamplerSta...
}}
の下に追加分
#code(C,nonumber,nomenu){{
DECLARE_UNIFORM_BUFFER_STRUCT_MEMBER_SAMPLER( SamplerSta...
}}
++ class RENDERER_API FSceneRenderTargets
+++
#code(C,nonumber,nomenu){{
const FTexture2DRHIRef& GetGBufferVelocityTexture() cons...
}}
の下に追加分
#code(C,nonumber,nomenu){{
const FTexture2DRHIRef& GetGBufferCellATexture() const {...
}}
+++
#code(C,nonumber,nomenu){{
TRefCountPtr<IPooledRenderTarget> GBufferVelocity;
}}
の下に追加分
#code(C,nonumber,nomenu){{
TRefCountPtr<IPooledRenderTarget> GBufferCellA;
}}
+ Engine\Source\Runtime\Renderer\Private\PostProcess\Scen...
++ FSceneRenderTargets::FSceneRenderTargets
#code(C,nonumber,nomenu){{
, GBufferVelocity(GRenderTargetPool.MakeSnapshot(Snapsho...
}}
の下に追加
#code(C,nonumber,nomenu){{
, GBufferCellA(GRenderTargetPool.MakeSnapshot(SnapshotSo...
}}
++ int32 FSceneRenderTargets::GetGBufferRenderTargets
の末尾に追加。MRTにGバッファを追加する
#code(C,nonumber,nomenu){{
OutRenderTargets[MRTCount++] = FRHIRenderTargetView(GBuf...
}}
++ FSceneRenderTargets::ReleaseGBufferTargets
の末尾に追加。
#code(C,nonumber,nomenu){{
GBufferCellA.SafeRelease();
}}
++ void FSceneRenderTargets::AllocGBufferTargets
+++
#code(C,nonumber,nomenu){{
if (bUseGBuffer)
{
}}
の中に追加分
#code(C,nonumber,nomenu){{
FPooledRenderTargetDesc CellRTDesc(FPooledRenderTargetDe...
GRenderTargetPool.FindFreeElement(RHICmdList, CellRTDesc...
}}
+++
#code(C,nonumber,nomenu){{
if (bCanReadGBufferUniforms)
{
}}
の中に追加分
#code(C,nonumber,nomenu){{
const FSceneRenderTargetItem& GBufferVelocityToUse = GBu...
}}
の下
#code(C,nonumber,nomenu){{
const FSceneRenderTargetItem& GBufferCellAToUse = GBuffe...
}}
+++
#code(C,nonumber,nomenu){{
GBufferResourceStruct.GBufferVelocityTexture = GBufferVe...
}}
の下
#code(C,nonumber,nomenu){{
GBufferResourceStruct.GBufferCellATexture = GBufferCellA...
}}
+++
#code(C,nonumber,nomenu){{
GBufferResourceStruct.GBufferVelocityTextureNonMS = GBuf...
}}
の下
#code(C,nonumber,nomenu){{
GBufferResourceStruct.GBufferCellATextureNonMS = GBuffer...
}}
+++
#code(C,nonumber,nomenu){{
GBufferResourceStruct.GBufferVelocityTextureMS = GBuffer...
}}
の下
#code(C,nonumber,nomenu){{
GBufferResourceStruct.GBufferCellATextureMS = GBufferCel...
}}
+++
#code(C,nonumber,nomenu){{
GBufferResourceStruct.GBufferVelocityTextureSampler = TS...
}}
の下
#code(C,nonumber,nomenu){{
GBufferResourceStruct.GBufferCellATextureSampler = TStat...
}}
+ 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(int...
}}
の下に追加。Gバッファのテクスチャの読み込み。DecodeGBuffe...
#code(C,nonumber,nomenu){{
float4 GBufferCellA = GBuffers.GBufferCellATextureNonMS....
}}
++ FGBufferData GetGBufferData
#code(C,nonumber,nomenu){{
float4 GBufferD = Texture2DSampleLevel(GBuffers.GBufferD...
}}
の下に追加。Gバッファのテクスチャの読み込み。DecodeGBuffe...
#code(C,nonumber,nomenu){{
float4 GBufferCellA = Texture2DSampleLevel(GBuffers.GBuf...
}}
++ FGBufferData GetGBufferDataMS
#code(C,nonumber,nomenu){{
float4 GBufferD = GBuffers.GBufferDTextureMS.Load(PixelP...
}}
の下に追加。Gバッファのテクスチャの読み込み。DecodeGBuffe...
#code(C,nonumber,nomenu){{
float4 GBufferCellA = GBuffers.GBufferCellATextureMS.Loa...
}}
++ 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 && (!SELECT...
}}
+++
#code(C,nonumber,nomenu){{
#else //WRITES_VELOCITY_TO_GBUFFER
}}
内に
#code(C,nonumber,nomenu){{
#define PIXELSHADEROUTPUT_MRT6 (USES_GBUFFER && (!SELECT...
#define PIXELSHADEROUTPUT_MRT7 (USES_GBUFFER && (!SELECT...
}}
+ 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\Materia...
#code(C,nonumber,nomenu){{
PPI_StoredSpecular UMETA(DisplayName="Specular (as store...
}}
の下に追加したGバッファ分を追記
#code(C,nonumber,nomenu){{
PPI_CellA UMETA(DisplayName="CellA (as stored in GBuffer...
}}
+ Engine\Source\Runtime\Engine\Private\Materials\HLSLMate...
++ void UseSceneTextureId(...)
#code(C,nonumber,nomenu){{
const bool bNeedsGBuffer = SceneTextureId == PPI_Diffuse...
}}
にGバッファ追加分を追加
#code(C,nonumber,nomenu){{
|| SceneTextureId == PPI_CellA
}}
終了行:
#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 - PerObjectGBuffer...
COLOR(#c03030){MRT[2]} - r - Metalic, g - Specular, b - r...
COLOR(#c03030){MRT[3]} - rgb - ベースカラー, a - EncodeIn...
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, CL...
→ WRITES_CUSTOMDATA_TO_GBUFFERがtrueの場合のみ使用される
→ 独自Shading Modelでも使用できる
* やってみた [#r6c702ae]
+ Engine\Source\Runtime\Renderer\Private\PostProcess\Scen...
++ BEGIN_UNIFORM_BUFFER_STRUCT(FGBufferResourceStruct, )
の中
+++
#code(C,nonumber,nomenu){{
DECLARE_UNIFORM_BUFFER_STRUCT_MEMBER_TEXTURE( Texture2D,...
}}
の下に追加分
#code(C,nonumber,nomenu){{
DECLARE_UNIFORM_BUFFER_STRUCT_MEMBER_TEXTURE(Texture2D, ...
}}
+++
#code(C,nonumber,nomenu){{
DECLARE_UNIFORM_BUFFER_STRUCT_MEMBER_TEXTURE( Texture2D<...
}}
の下に追加分
#code(C,nonumber,nomenu){{
DECLARE_UNIFORM_BUFFER_STRUCT_MEMBER_TEXTURE( Texture2D<...
}}
+++
#code(C,nonumber,nomenu){{
DECLARE_UNIFORM_BUFFER_STRUCT_MEMBER_TEXTURE( Texture2DM...
}}
の下に追加分
#code(C,nonumber,nomenu){{
DECLARE_UNIFORM_BUFFER_STRUCT_MEMBER_TEXTURE( Texture2DM...
}}
+++
#code(C,nonumber,nomenu){{
DECLARE_UNIFORM_BUFFER_STRUCT_MEMBER_SAMPLER( SamplerSta...
}}
の下に追加分
#code(C,nonumber,nomenu){{
DECLARE_UNIFORM_BUFFER_STRUCT_MEMBER_SAMPLER( SamplerSta...
}}
++ class RENDERER_API FSceneRenderTargets
+++
#code(C,nonumber,nomenu){{
const FTexture2DRHIRef& GetGBufferVelocityTexture() cons...
}}
の下に追加分
#code(C,nonumber,nomenu){{
const FTexture2DRHIRef& GetGBufferCellATexture() const {...
}}
+++
#code(C,nonumber,nomenu){{
TRefCountPtr<IPooledRenderTarget> GBufferVelocity;
}}
の下に追加分
#code(C,nonumber,nomenu){{
TRefCountPtr<IPooledRenderTarget> GBufferCellA;
}}
+ Engine\Source\Runtime\Renderer\Private\PostProcess\Scen...
++ FSceneRenderTargets::FSceneRenderTargets
#code(C,nonumber,nomenu){{
, GBufferVelocity(GRenderTargetPool.MakeSnapshot(Snapsho...
}}
の下に追加
#code(C,nonumber,nomenu){{
, GBufferCellA(GRenderTargetPool.MakeSnapshot(SnapshotSo...
}}
++ int32 FSceneRenderTargets::GetGBufferRenderTargets
の末尾に追加。MRTにGバッファを追加する
#code(C,nonumber,nomenu){{
OutRenderTargets[MRTCount++] = FRHIRenderTargetView(GBuf...
}}
++ FSceneRenderTargets::ReleaseGBufferTargets
の末尾に追加。
#code(C,nonumber,nomenu){{
GBufferCellA.SafeRelease();
}}
++ void FSceneRenderTargets::AllocGBufferTargets
+++
#code(C,nonumber,nomenu){{
if (bUseGBuffer)
{
}}
の中に追加分
#code(C,nonumber,nomenu){{
FPooledRenderTargetDesc CellRTDesc(FPooledRenderTargetDe...
GRenderTargetPool.FindFreeElement(RHICmdList, CellRTDesc...
}}
+++
#code(C,nonumber,nomenu){{
if (bCanReadGBufferUniforms)
{
}}
の中に追加分
#code(C,nonumber,nomenu){{
const FSceneRenderTargetItem& GBufferVelocityToUse = GBu...
}}
の下
#code(C,nonumber,nomenu){{
const FSceneRenderTargetItem& GBufferCellAToUse = GBuffe...
}}
+++
#code(C,nonumber,nomenu){{
GBufferResourceStruct.GBufferVelocityTexture = GBufferVe...
}}
の下
#code(C,nonumber,nomenu){{
GBufferResourceStruct.GBufferCellATexture = GBufferCellA...
}}
+++
#code(C,nonumber,nomenu){{
GBufferResourceStruct.GBufferVelocityTextureNonMS = GBuf...
}}
の下
#code(C,nonumber,nomenu){{
GBufferResourceStruct.GBufferCellATextureNonMS = GBuffer...
}}
+++
#code(C,nonumber,nomenu){{
GBufferResourceStruct.GBufferVelocityTextureMS = GBuffer...
}}
の下
#code(C,nonumber,nomenu){{
GBufferResourceStruct.GBufferCellATextureMS = GBufferCel...
}}
+++
#code(C,nonumber,nomenu){{
GBufferResourceStruct.GBufferVelocityTextureSampler = TS...
}}
の下
#code(C,nonumber,nomenu){{
GBufferResourceStruct.GBufferCellATextureSampler = TStat...
}}
+ 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(int...
}}
の下に追加。Gバッファのテクスチャの読み込み。DecodeGBuffe...
#code(C,nonumber,nomenu){{
float4 GBufferCellA = GBuffers.GBufferCellATextureNonMS....
}}
++ FGBufferData GetGBufferData
#code(C,nonumber,nomenu){{
float4 GBufferD = Texture2DSampleLevel(GBuffers.GBufferD...
}}
の下に追加。Gバッファのテクスチャの読み込み。DecodeGBuffe...
#code(C,nonumber,nomenu){{
float4 GBufferCellA = Texture2DSampleLevel(GBuffers.GBuf...
}}
++ FGBufferData GetGBufferDataMS
#code(C,nonumber,nomenu){{
float4 GBufferD = GBuffers.GBufferDTextureMS.Load(PixelP...
}}
の下に追加。Gバッファのテクスチャの読み込み。DecodeGBuffe...
#code(C,nonumber,nomenu){{
float4 GBufferCellA = GBuffers.GBufferCellATextureMS.Loa...
}}
++ 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 && (!SELECT...
}}
+++
#code(C,nonumber,nomenu){{
#else //WRITES_VELOCITY_TO_GBUFFER
}}
内に
#code(C,nonumber,nomenu){{
#define PIXELSHADEROUTPUT_MRT6 (USES_GBUFFER && (!SELECT...
#define PIXELSHADEROUTPUT_MRT7 (USES_GBUFFER && (!SELECT...
}}
+ 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\Materia...
#code(C,nonumber,nomenu){{
PPI_StoredSpecular UMETA(DisplayName="Specular (as store...
}}
の下に追加したGバッファ分を追記
#code(C,nonumber,nomenu){{
PPI_CellA UMETA(DisplayName="CellA (as stored in GBuffer...
}}
+ Engine\Source\Runtime\Engine\Private\Materials\HLSLMate...
++ void UseSceneTextureId(...)
#code(C,nonumber,nomenu){{
const bool bNeedsGBuffer = SceneTextureId == PPI_Diffuse...
}}
にGバッファ追加分を追加
#code(C,nonumber,nomenu){{
|| SceneTextureId == PPI_CellA
}}
ページ名: