Stencilを使ったアウトラインの色分け

お世話になっております。
現在、以下の記事を参考にしながら、ポストプロセスによるアウトラインの作成を試みています。

StencilValueを用いて色分けを行いたいのですが、以下の画像のようにマテリアルを組むと、アウトラインが2重になってしまい、さらにifでの分岐もうまくいかなくなってしまいます。

実行結果

こちら、なぜ2重になっているのか、なぜ青と赤両方が出ているのかが理解できないのですが、ご教授頂けますでしょうか?
(添付画像に使用しているBPを添付しております。)

以上、よろしくお願いいたします。

問題は色々ありますが、色に関しては、CustomStencilの扱い方に問題がある、というところでしょう

CustomStencilは、指定のObjectが存在するPixel上に、Stencil情報を書き込みます
つまり単純にその場所のStencil値を取るだけでは、塗り分けはできません

2重になっている理由ですが、ObjectのあるPixel(Objectに重なっているところ)だけ赤く出力される、という処理になっているためです
(画像1枚目)
SobelFilterは色には寄与せず、どこに色を置くか、という情報しか出力していないため、そのような状態になっています

色を分けたいのであれば、一番単純な方法としては、CustomStencilの値ごとに別々のSobelFilterを用意することでしょう
指定のStencil値のときのみ、Sobel結果を出力するようにできれば、あとはそれを合成するだけで解決できます

ご回答頂き、ありがとうございます!
私の知識では理解が追い付かない箇所が多々あるため、お手数をお掛けしてしまい申し訳ありませんが、もう一歩かみ砕いた内容をお伺いさせてください。

つまり単純にその場所のStencil値を取るだけでは、塗り分けはできません

こちらですが、今の認識ではStencilの値はオブジェクトを識別する番号のようなイメージを持っており、それで色分けができるのではと考えたのですが、あくまでもStencilがあるかないかで情報を書き込む、TrueとFalseの2つしか取れないようなイメージのものということでしょうか?

Objectに重なっているところだけ赤く出力される

こちらは白いCube(Object)と背景のSkysphereや地面のFloorが重なっているところ、という理解であっていますでしょうか…?

色を分けたいのであれば、一番単純な方法としては、CustomStencilの値ごとに別々のSobelFilterを用意することでしょう。指定のStencil値のときのみ、Sobel結果を出力するようにできれば、あとはそれを合成するだけで解決できます

すみません、こちらが今一つ良く理解できませんでした。
ノード例を頂く事は可能でしょうか?

以上となります。
ご教授頂けますと幸いです。

色を後ろで順々に置いていっているのは、設定を上書きしているようなイメージでしょうか?elseのように0で続いてきた中で、どこかで1で拾っているイメージでしょうか?

上書きのイメージが近いです
Photoshop等を使ったことがあればイメージしやすいのですが、ベースの絵(PostProcessInput0)の上にレイヤーを重ねてマスク塗りしている感じです

ですので、優先的に出したい色があれば、最後に重ねるようにしましょう

こちらですが、今の認識ではStencilの値はオブジェクトを識別する番号のようなイメージを持っており、それで色分けができるのではと考えたのですが、あくまでもStencilがあるかないかで情報を書き込む、TrueとFalseの2つしか取れないようなイメージのものということでしょうか?

CustomStencilはビット値で入力されるため、数字で入る、という認識は間違いではないです
今回の場合では、アウトラインはたいていObjectの外に広げて描くため、その場所のCustomStencilを単純に参照しても期待した値は取れない、ということです

こちらは白いCube(Object)と背景のSkysphereや地面のFloorが重なっているところ、という理解であっていますでしょうか…?

CustomStencilの設定されたObjectが描画されているピクセル、という意味です
アウトラインを太くしていくと外にも広がりますが、内側にも広がりますよね?
今回の例ではその内側に広がってObjectに重なった領域だけ赤くなっている、ということです


修正例です
下記のようにCustomStencilの値ごとにSobelFilterを行い、Lerpで合成しています

SobelFilterの内容は同じですが、大きな修正は1箇所
CustomStencil値を取得している部分に、目的のStencil値のときだけ1を出力するように変えます

310534-2020-08-18-16h24-38.png

ご回答頂き、ありがとうございます!

今回の場合では、アウトラインはたいていObjectの外に広げて描くため、その場所のCustomStencilを単純に参照しても期待した値は取れない

なるほど、こちらの説明でしっくりきました。ありがとうございます。

アウトラインを太くしていくと外にも広がりますが、内側にも広がりますよね?
今回の例ではその内側に広がってObjectに重なった領域だけ赤くなっている、ということです

こちらも、しっくりきました。内側にも広がるという発想が欠けていたため、内側にだけ赤くなって見えているという謎が解けました。ありがとうございます。

修正例です

修正例のご提示、ありがとうございます。
ノードを見ても今一つわからないところが多々あるので、長い時間をかけて読み解いていきたいと思います。最後に1つご教授願いたいのですが、色を後ろで順々に置いていっているのは、設定を上書きしているようなイメージでしょうか?elseのように0で続いてきた中で、どこかで1で拾っているイメージでしょうか?

以上となります。
ご教授頂けると幸いです。

ご回答頂き、ありがとうございます!
なるほど、レイヤーを重ねてマスク塗りしている感じなのですね。

優先的に出したい色があれば、最後に重ねるようにしましょう

こちら、承知しました。
色々とご教授頂き、ありがとうございました!