Santarh / MToon

Toon Shader with Unity Global Illumination

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

輪郭線幅のテクスチャに#010101より暗い点が入ると輪郭色に塗りつぶされる

m2wasabi opened this issue · comments

アウトラインテクスチャで黒の塗りつぶし(#010101よりも暗い点)があると、マテリアル自体がアウトライン色に塗られてしまいます。

アウトラインのWidth Mode は WorldCoordinates , ScreenCoordinates のどちらでも発生します。

症状が出ているのはメッシュの中で裏からも見える部分のようです

エディタ内で確認。ビルド後もそうであるかは未確認です。

image

Platform: Windows10 Pro build 17134.648
Unity Editor version: 2018.2.15f1
UniVRM Version: 0.51.0

ご報告ありがとうございます。

Z-Fighting による問題だと推測します。

まず WorldCoordinates における線幅は m 単位です。
ここで添付していただいた画像の設定は 0.01m に対して 1/256 を乗算して 0.04mm 幅の輪郭線、ということになります。
これくらい細い輪郭線ですと、MToon に関係なく Z Buffer による深度テストに失敗して Z-Fighting に至ってしまうことがあります。

解決したいところではあるのですが、自分ではあまり良い解決策に至っておりません。
できれば細すぎる輪郭線はなるべく避けていただけると幸いです。

また他に解決策のほうがあればご教示いただければ幸いです。

float3 outlineOffset = 0.01 * _OutlineWidth * outlineTex * worldNormalLength * v.normal;
float4 vertex = UnityObjectToClipPos(v.vertex + outlineOffset);

ここですよね。
今の仕様だと微小値の積でオフセットに0に漸近する値を投入できてしまうので、
(極端な話テクスチャ値が0だと他のパラメータに何入れても無駄になる)
例えばオフセットに下限を設けるとかですかね。

訂正。
WorldCoordinates における線幅は cm 単位です。

したがって 0.01 かつ画像が 0x01 の場合 0.0004mm ですね…

PullReqにて、ユーザー設定値の最終段をclampしてみました。こんな風ではいかがでしょう?

この問題ですが、ZBuffer の精度に因るものです。
したがって、このシェーダがたとえば Unity 外に移植される場合には別の閾値になりえます。
そういった影響を考慮した結果、この問題は MToon の計算による頂点座標定義ではなく、
あくまで Unity に依存する解決法として Z Offset をかけることで解決したいと思います。