情報共有ネタ:SeparateTranslucencyの書き戻し負荷の対策

お世話になっております。

WinterCrownWORKSの梶井です。

PostProcessでαを使わない場合の調整の調整になります。(Bloomの後の書き込み次第ではα使ってても大丈夫かも知れませんが)

まず、半透明縮小バッファの流れなのですが、

縮小バッファを使った場合SeparateTranslucency用のバッファが作成されTranslucencyやDisolveの後、BokehDofRecombineにてSeparateTranslucencyがUpScaleされてシーンにマージされます。



このマージ結果の格納先がRGBAFloat(R16G16B16A16)の64bitFormatになっており、RecombineとそのあとのBloomの一発目のDownSampleがそこそこに重い状態になります。



今回のネタはこのRecombineのバッファ変更になります。

この格納先のバッファは実はRecombine用に独立しているので、実はフォーマットが変更可能です。



Engine\Source\Runtime\Renderer\Private\PostProcess\PostProcessBokehDOFRecombine.cppにて

FPooledRenderTargetDesc FRCPassPostProcessBokehDOFRecombine::ComputeOutputDesc(EPassOutputId InPassOutputId) const

{

FPooledRenderTargetDesc Ret = GetInput(ePId_Input0)->GetOutput()->RenderTargetDesc;

Ret.Reset();



Ret.TargetableFlags &= ~(TexCreate_RenderTargetable | TexCreate_UAV);

Ret.TargetableFlags |= bIsComputePass ? TexCreate_UAV : TexCreate_RenderTargetable;

//--------------yuu_kajii@winter-crown-works.com------------//

#if 1

Ret.Format = PF_FloatR11G11B10;

#else

#endif

//----------------------------------------------------------//

Ret.AutoWritable = false;

Ret.DebugName = TEXT(“BokehDOFRecombine”);

Ret.Flags |= GFastVRamConfig.BokehDOF;



return Ret;

}

このような形にしてフォーマットをRGBFloat(R11G11B10Float)の32bitFormatにすることによって、高速化を行いました。

GPUが弱いハードウェアほど効果があった次第です。



こちらちょっとした高速化ネタになりますが、参考になればと思います。

今回コードがただ変更をしてしまいましたが、ポストプロセス側でαを持つのかどうかコンソール変数から分かるはずなので、そちらで切り替えるように実装するのが良いかも知れません。

情報共有ネタなのでクローズします。