ARで現実の背景以外のオブジェクトにBloomかけたい

方針①
BloomOjectsCamera
Opaque->Transparent->自作BloomFeature(Transparentな2DTexにレンダリング)
ARCamera
ARBackgroundFeature->PostProcessComposeFeature(BloomObjectCameraの2DTexとBlend)

BloomFeature作ってみる
書き方がRenderFeatureじゃなくてBuilt-in(?)なので、Render Featureに書き直す
変更点
-
テクスチャのセット方法が違いそう
ベースのテクスチャはMainTexに勝手に入るので書かなくていい -
Blitの書き方が違う
Graphics.Blit(currentSource, currentDest, _material, pathIndex);
cmd.Blit(source, currentRenderTexture, _material, pathIndex);
- RenderTextureの初期化or Identifierを渡すやり方が違う

バージョンごとのRenderFeatureの書き方は
このサンプルを見てねってことかな
んー、、ミニマムじゃないしあまり助けにならなかったかも
SSAO RenderPassのBlit書き方
Blitter.BlitCameraTexture(cmd, baseMap, renderer.cameraColorTargetHandle, RenderBufferLoadAction.Load, RenderBufferStoreAction.Store, mat, (int)pass);
別サンプルにあった書き方を真似して、動いたもの
RTHandle cameraDepthTargetHandle = _renderer.cameraDepthTargetHandle;
var source = cameraDepthTargetHandle;
// 別カメラで実行されたRenderTexture: _bloomTexを現在のカメラにBlitする
CommandBuffer cmd = CommandBufferPool.Get(NAME);
_material.SetTexture(Shader.PropertyToID("_bloomTex"), _bloomTex);
cmd.Blit(source, _renderer.cameraDepthTargetHandle, _material);
context.ExecuteCommandBuffer(cmd);
CommandBufferPool.Release(cmd);
cmd.Blit
で動作を登録して、context.ExecuteCommandBuffer(cmd)
で実行する。
cmd.Blitだけ書いてcontext.Exec...してなかった

Shaderの方でエラー
A multisampled texture being bound to a non-multisampled sampler. Disabling in order to avoid undefined behavior. Please use Texture2DMS in the shader.
Textureの渡し方使い方がおかしそう
multisamplingしているつもりはない
ああ、sourceとtargetのテクスチャDepthになっちゃってるじゃん
RTHandle cameraColorTargetHandle = _renderer.cameraColorTargetHandle;
var source = cameraColorTargetHandle;
// 別カメラで実行されたRenderTexture: _bloomTexを現在のカメラにBlitする
CommandBuffer cmd = CommandBufferPool.Get(NAME);
_material.SetTexture(Shader.PropertyToID("_bloomTex"), _bloomTex);
cmd.Blit(source, _renderer.cameraColorTargetHandle, _material);
context.ExecuteCommandBuffer(cmd);
CommandBufferPool.Release(cmd);

Textureが差し込めてない
書き込み側は書き込めていそう
_material.SetTexture(Shader.PropertyToID("_BloomTex"), _bloomTex);
shaderの中は"_BloomTex"なのに、PropertyToID("_bloomTex")になってました。

惜しい。背景が灰色

Bloomがなんか汚いのは後で直すとして

結局
ここまではできた(ピンクはオクルージョンにしてみた)

あとは、ARFoundationのOcclusionを反映させたい
(手をかざしてもオクルージョンしない↓)

Depthのテクスチャをどうにか持ってきてbloomかけてるカメラのOpaque前で入れる方針を考えてる
ARBackgroundRenderFeatureではこう持ってきてる↓
ConfigureInputってなんの関数だ...
protected override void SetupInternal(ARCameraBackground cameraBackground)
{
if (cameraBackground.GetComponent<AROcclusionManager>()?.enabled ?? false)
{
// If an occlusion texture is being provided, rendering will need
// to compare it against the depth texture created by the camera.
ConfigureInput(ScriptableRenderPassInput.Depth);
}
}

これかなー...深度比較の方法を考える

この辺りを参考にしつつ
こんな感じで
できた
(現実世界にはかかってないよがわかりにくいけど...)

overlay cameraでもう一回確認してみたけど、Overlayのレンダリング時にBaseCameraの結果が一番下に敷かれている

現状だと、上の画像の赤点線が入ってないので、bloomかけないオブジェクトと同時にレンダリングできないから、全てがadditiveな見た目になってしまって、黒いオブジェクトとかどうなるのやら...