SnelDev
(SnelDev)
1
お世話になっております。
現在、以下の記事を参考にしながら、ポストプロセスによるアウトラインの作成を試みています。
StencilValueを用いて色分けを行いたいのですが、以下の画像のようにマテリアルを組むと、アウトラインが2重になってしまい、さらにifでの分岐もうまくいかなくなってしまいます。
実行結果
こちら、なぜ2重になっているのか、なぜ青と赤両方が出ているのかが理解できないのですが、ご教授頂けますでしょうか?
(添付画像に使用しているBPを添付しております。)
以上、よろしくお願いいたします。
問題は色々ありますが、色に関しては、CustomStencilの扱い方に問題がある、というところでしょう
CustomStencilは、指定のObjectが存在するPixel上に、Stencil情報を書き込みます
つまり単純にその場所のStencil値を取るだけでは、塗り分けはできません
2重になっている理由ですが、ObjectのあるPixel(Objectに重なっているところ)だけ赤く出力される、という処理になっているためです
(画像1枚目)
SobelFilterは色には寄与せず、どこに色を置くか、という情報しか出力していないため、そのような状態になっています
色を分けたいのであれば、一番単純な方法としては、CustomStencilの値ごとに別々のSobelFilterを用意することでしょう
指定のStencil値のときのみ、Sobel結果を出力するようにできれば、あとはそれを合成するだけで解決できます
SnelDev
(SnelDev)
3
ご回答頂き、ありがとうございます!
私の知識では理解が追い付かない箇所が多々あるため、お手数をお掛けしてしまい申し訳ありませんが、もう一歩かみ砕いた内容をお伺いさせてください。
つまり単純にその場所の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を出力するように変えます

SnelDev
(SnelDev)
6
ご回答頂き、ありがとうございます!
今回の場合では、アウトラインはたいていObjectの外に広げて描くため、その場所のCustomStencilを単純に参照しても期待した値は取れない
なるほど、こちらの説明でしっくりきました。ありがとうございます。
アウトラインを太くしていくと外にも広がりますが、内側にも広がりますよね?
今回の例ではその内側に広がってObjectに重なった領域だけ赤くなっている、ということです
こちらも、しっくりきました。内側にも広がるという発想が欠けていたため、内側にだけ赤くなって見えているという謎が解けました。ありがとうございます。
修正例です
修正例のご提示、ありがとうございます。
ノードを見ても今一つわからないところが多々あるので、長い時間をかけて読み解いていきたいと思います。最後に1つご教授願いたいのですが、色を後ろで順々に置いていっているのは、設定を上書きしているようなイメージでしょうか?elseのように0で続いてきた中で、どこかで1で拾っているイメージでしょうか?
以上となります。
ご教授頂けると幸いです。
SnelDev
(SnelDev)
7
ご回答頂き、ありがとうございます!
なるほど、レイヤーを重ねてマスク塗りしている感じなのですね。
優先的に出したい色があれば、最後に重ねるようにしましょう
こちら、承知しました。
色々とご教授頂き、ありがとうございました!