このチュートリアルでは、Blender の Compositing Render Passes のうち、ポストプロダクションでオブジェクトの距離情報やシーンの深度情報を提供してくれる Depth と Mist の機能、設定、共通点、そして違いについて見ていきます。
動画の書き起こし
皆さんこんにちは!このチュートリアルでは、Blender の Compositing Render Passes のうち、ポストプロダクションでオブジェクトの距離情報やシーンの深度情報を提供してくれる Depth と Mist の機能、設定、共通点、そして違いについて見ていきます。
どちらも、カメラに最も近いポイントを黒、最も遠いポイントを白として表現する画像を取得するために使用できます。これにより、これらの画像をレンダリングに直接ブレンドしたり、あるいはマスクとして使用して別の効果を作成したりできます。たとえば、私の Atmospheric Perspective ビデオチュートリアルシリーズで紹介したような使い方です。
ただし、違いはあります。仮想シーン内で値の範囲がどのように計算されるかだけでなく、生成される画像の特性にも違いがあり、それによって用途によって適している場合と適していない場合があります。これらの違いをより分かりやすく説明するために、このチュートリアルでは 2 つの 3D シーンを使用し、毎回いくつかの設定を変更しながら結果の違いを見ていきます。
要するに、Depth と Mist の違いは、Depth が仮想カメラからオブジェクトまでの実際の距離値を返すのに対し、Mist はカメラから一定距離の位置からフォグを発生させ、指定した深度にわたって増加させる点です。その距離を超えると、すべてが白になります。
そのため、Depth は実際の距離値を使用する必要がある用途に適しています。たとえば、Defocus ノードや Z-Combine ノードです。
Defocus は、カメラから特定距離にある要素へフォーカスを合わせ、それ以外をぼかすことができます。つまり、被写界深度を実装できます。

一方、Z-Combine は、2 つのシーンをブレンドする際に、各シーンまたは画像の Z または Depth フィールドに保存されたカメラからの距離値に基づいて、どのピクセルを表示するかを決定します。

ただし、これは Depth が他の用途に使えないという意味ではありません。私自身、Atmospheric Perspective のシリーズで使用しましたが、その際には Depth が返す情報を正規化する必要がありました。Depth を正規化するとはどういう意味か、そしてそれによってデータにどのような影響があるのかを、これから見ていきます。
Depth Render Pass は、Properties editor の View Layers タブにある Passes セクションでデフォルトで選択されています。このタブでは、この Render Pass は Z と呼ばれていますが、Compositing の Render Layers ノードでは Depth と呼ばれています。

Depth が返す最小距離値は Camera オブジェクトの Clip Start の値です。なぜなら、Clip Start よりカメラに近いオブジェクトはレンダリングされないためです。したがって、Depth の出力が正規化されていない場合、それが Depth が返せる最小値になります。

一方、Depth が返す最大距離値は Camera オブジェクトの Clip End の値です。Clip End を超えた位置のオブジェクトはレンダリングされないためです。仮想空間の背景は無限距離にあるものとして扱われるため、Depth マスクでは最大値になります。
Camera を選択し、Properties editor の Data タブにある Viewport Display セクションで Limits オプションを有効にすると、3D シーン内に Clip Start と Clip End のポイントを表示できます。
これにより、Clip End の値を適切に設定しやすくなります。

一方、Mist は、Camera からの距離が増えるにつれて徐々に白くなる画像を返します。ただし、この場合、フォグ効果の開始位置は Clip Start ではなく、任意に指定できる Mist Start という値によって決まります。
Depth はデフォルトで有効ですが、Mist Render Pass は Passes セクションで明示的に有効化する必要があります。この操作はレンダリング開始前に行う必要があります。そうしないと情報が処理されず、使用するには再度レンダリングを開始する必要があります。
Mist Render Pass を有効にすると、World タブに Mist という新しいセクションが表示され、そこで Mist Start やその他のパラメータを設定できます。

Mist と Depth のもう一つの違いがあります。Mist は、すべてのオブジェクトが白としてレンダリングされる距離を決定するために Clip End を使用しません。その代わり、Mist Depth というパラメータを使用します。つまり、Start + Depth の距離に配置されたすべてのオブジェクトが白としてレンダリングされます。
Data タブの Viewport Display セクションで Mist のチェックボックスを有効にすると、3D Viewport 内に Mist Start と Mist Depth を表示することもできます。もし Limits オプションも有効にしている場合は、表示が重なるため無効にすることをおすすめします。

再度レンダリングする前に、Mist の効果が Clip Start と Clip End の値に重なるように Mist Start と Depth の値を設定します。
World タブの Mist セクションには、もう一つ Falloff というパラメータがあります。これは、距離に応じてフォグをどのように適用するかを指定します。デフォルトは Quadratic ですが、Inverse Quadratic や Linear も選択できます。
Quadratic はライティングと同じ遷移を実装し、0 から 1 へのより滑らかな変化を提供します。Linear は Quadratic より少しシャープな遷移を実装します。最後に、Inverse Quadratic は非常に速く 0 から 1 へ変化するため、前景の要素にも濃いフォグが表示されます。

Z-Depth にはこのパラメータがありません。なぜなら、これは数式に従って実装される効果ではなく、オブジェクトの実際の距離値を返すものだからです。常に linear だと言うこともできますが、その説明にはあまり意味はありません。
先ほど述べたように、Z-Depth は実際の距離情報を取得する用途に適しており、Mist はその名前の由来でもあるフォグ効果を作成する用途に適しています。なぜなら、特徴を自由に設定できるからです。
この時点でレンダリングを行い、Compositor ウィンドウで Passes を確認すると、Mist 出力からは興味深い結果が得られますが、Depth から来るマスクは、少なくとも見た目上は使用不可能に見えるでしょう。

では次に、「Depth を正規化する」とはどういう意味か、そしてなぜ多くのチュートリアルで Normalize ノードが使用されるのかを見ていきましょう。
先ほど説明したように、Z-Depth が返す値は 0 から 1 の範囲ではなく、実際には仮想 Camera からの距離を示しています。そのため、たとえばカメラから正確に特定距離の位置でエフェクトを発生させたい場合に便利です。

保存される数値は非常に大きくなる可能性があるため、Z-Depth フィールドは JPG や PNG のような多くの画像ファイルで使用される 8 bit や 16 bit より多くのメモリを使用してデータを保存します。おそらく実際には 32 bit を使用しています。
さらに、Backdrop では 1 を超えるすべての値はその値に切り詰められ、対応するピクセルは白として表示されます。しかし、Z-Depth の値は通常 1 よりはるかに大きい Clip End によって決まります。
そのため、返される値は Compositing editor の Backdrop では正しく表示されません。このタブでは、1 を超えるすべての値が白としてレンダリングされるからです。したがって、多くの場合、返される画像は非常に明るく、ディテールが欠けているように見えます。
実際、私が使用しているシーンでは、Clip Start の値は 1、Clip End は 20000 なので、Depth Pass は完全に白く見えます!
このため、Utilities グループの Normalize ノードを使用して、値を 0 から 1 の範囲へマッピングすることがよくあります。ただし、この点については重要な補足があるため、少し説明が必要です。

Normalize ノードは、Clip Start と Clip End の値を 0 から 1 にマッピングするわけではありません。その代わり、処理する画像内に存在するピクセルの最小値と最大値を基準にします。
ただし、これは Backdrop で見えている画像ではありません。先ほど説明したように、Depth チャンネルは表示されている以上に多くのデータを保存しているからです。
そのため、Depth 出力と Viewer の間に Normalize ノードを接続すると、レンダリング下部の要素が黒く見えます。なぜなら、それらは仮想カメラに最も近いポイントであり、Depth マスク内で最も暗い値を持っているため、正規化後は黒としてレンダリングされるからです。もちろん、それらが Camera の Clip Start の距離にあるわけではありません。

同様の考え方は、より遠くにあるオブジェクトや、Depth マスクの正規化版で白として表示されるピクセルにも当てはまります。
Normalize が入力画像内の最小値と最大値に基づいて動作することをさらに示すために、Mist からの情報も Normalize してみましょう。下部の暗いピクセルは 0 に再マッピングされ、黒として表示されます。一方、最も遠い要素のピクセルはすでに白だったため、そのまま変化しません。
この概念をより理解しやすくするために、別の例をお見せします。今表示しているシーンでは、カメラといくつかのオブジェクトが部屋の中に配置されています。
Camera の Clipping End 値は、部屋の中で最も遠くに配置された Box の前面はレンダリングされるものの、部屋の奥の壁はレンダリングされないように設定されています。

実際には、最も遠い Box も完全には表示されていませんが、これはフレーミングによる遠近効果のためです。

Clip Start はカメラから 10 センチメートルに設定されていますが、その近くにオブジェクトは配置されていません。フレーム端に見える部屋の壁でさえ、それより遠い距離にあります。
この状態でレンダリングを開始し、正規化されていない Depth Render Pass を確認すると、奥の壁は完全に白になります。実際、Depth Pass は最も遠い Box の向こう側を見ることができず、それ以降をすべて白としてレンダリングするためです。
ただし、黒い領域はありません。先ほど説明したように、Clip Start に配置されたオブジェクトが存在しないからです。

しかし、Normalize ノードを使用すると、下部に黒い帯が追加されます。これは以前のシーンでも見られた現象で、その床部分がカメラに最も近いことを示しています。

側面の壁の一つを内側へ移動し、カメラに近づけてから再度レンダリングすると、先ほど説明した内容を確認できます。

Normalize によって Depth マスクがどのように変化するかを理解することは重要です。
このノードは Mist には使用すべきではありません。また、Depth に対して使用する場合も慎重に判断する必要があります。先ほど触れた Atmospheric Perspective のような特殊効果用のマスクを作成する際には便利ですが、他のケースでは使用しない方が良い場合があります。
では、「Clip Start と Clip End の値を 0 から 1 の範囲にマッピングして、Backdrop 上で Depth マスクを確認する方法はあるのか?」と思うかもしれません。
あります。Compositor の Utilities グループから Map Range ノードを追加し、そのノードの From Min と From Max の値を Camera の Clip Start と Clip End の値に設定してください。
Mist Pass に似たマスクが得られますが、もちろん実際の深度値は失われます。

このチュートリアルを終える前に、もう一つ重要な違いを強調しておきます。それは、シーン内オブジェクトの距離値を計算する際に使用されるサンプル数です。
Mist は Anti-Aliasing も実装していますが、これは Z-Depth では計算されません。
特に Z-Depth は 1 サンプルしか使用しません。そのため、Motion Blur や Depth of Field のようなエフェクトを使用しない場合、つまり深度値をブレンドする必要がないケースでは問題なく使用できます。深度値をブレンドする必要がある場合は、Mist を使用する方が適しています。

最後に、レンダリングの Color Management 設定と、Backdrop 上での Z-Depth および Mist マスクの表示について考えてみましょう。
View Transform パラメータで選択したモードによって、Mist と Depth の両方について、正規化されているかどうかに関係なく、画面に表示される結果は大きく変化する場合があります。

ただし、これらの変換は Backdrop 上でのデータ表示にのみ影響するはずなので、本来の値自体を変更することはありません。

それでは、このチュートリアルは以上です!お役に立てば嬉しいです!また次回お会いしましょう!