Open15

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

さくたまさくたま

方針①
BloomOjectsCamera
Opaque->Transparent->自作BloomFeature(Transparentな2DTexにレンダリング)

ARCamera
ARBackgroundFeature->PostProcessComposeFeature(BloomObjectCameraの2DTexとBlend)

さくたまさくたま

BloomFeature作ってみる
https://light11.hatenadiary.com/entry/2018/03/15/000022

書き方がRenderFeatureじゃなくてBuilt-in(?)なので、Render Featureに書き直す

変更点

  1. テクスチャのセット方法が違いそう
    ベースのテクスチャはMainTexに勝手に入るので書かなくていい

  2. Blitの書き方が違う

            Graphics.Blit(currentSource, currentDest, _material, pathIndex);
                cmd.Blit(source, currentRenderTexture, _material, pathIndex);
  1. RenderTextureの初期化or Identifierを渡すやり方が違う
さくたまさくたま

んー、、ミニマムじゃないしあまり助けにならなかったかも

SSAO RenderPassのBlit書き方

                    Blitter.BlitCameraTexture(cmd, baseMap, renderer.cameraColorTargetHandle, RenderBufferLoadAction.Load, RenderBufferStoreAction.Store, mat, (int)pass);

別サンプルにあった書き方を真似して、動いたもの

AdditiveRenderFeature.cs
            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になっちゃってるじゃん

AdditiveRenderFeature.cs
            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が差し込めてない

書き込み側は書き込めていそう

AdditiveRenderFeature
  _material.SetTexture(Shader.PropertyToID("_BloomTex"), _bloomTex);

shaderの中は"_BloomTex"なのに、PropertyToID("_bloomTex")になってました。

さくたまさくたま

結局

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

さくたまさくたま

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

さくたまさくたま

Depthのテクスチャをどうにか持ってきてbloomかけてるカメラのOpaque前で入れる方針を考えてる
ARBackgroundRenderFeatureではこう持ってきてる↓
ConfigureInputってなんの関数だ...

ARBackgroundRenderFeature.cs
            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な見た目になってしまって、黒いオブジェクトとかどうなるのやら...