Onoty3D

Unityに関するメモとか

【検証不足】Planar Decal、テクスチャのUVに依存しないデカールシェーダを作る。

【検証不足】18/09/08 追記
ボーンが仕込まれたモデルの場合、ボーンの回転などで各頂点のローカル座標が動的に変更されると、デカールの位置がずれてしまいます。
Transformのポジション移動(ローカル座標に影響しない)しか考えてなかった…。
なのでボーンのないオブジェクト以外では、理想通りの振る舞いをしない可能性が高いです。申し訳ありません…。
ここは課題として、改良していきます。

------------------------------------------------------------------------------------------------------------------

キャラクターモデルの衣装に何かしら装飾を加えたい場合、テクスチャを直接加工するのもいいですが、デカール処理のあるシェーダーをつかうと、元のテクスチャにレイヤーのように重ねることが出来、便利です。
ただ若干難があり、衣装などは軽量化目的などで左右対称のUVになっていることも多いので、大抵のデカールシェーダーはそれに影響されて左右対称になってしまいます。

f:id:onoty3d:20180801171224p:plain
左右対称以前になんか色々残念な表示になっちゃった。

こういう場合、メインのテクスチャとは別にUV(セカンダリUV)を作成し、そこにデカールを載せたりしますが、少し大変で、DCCツールやスクリプトが必要だったりします。

ちなみに以前血糊表現でセカンダリUVを動的作成しました。

onoty3d.hatenablog.com

今回は別法で、Planarシェーダという仕組みを使ってみます。
Planarとは「平面」のこと。UV情報を使わず、メッシュの頂点の座標を平面の座標として扱い、その数値によってテクスチャを描画する方法です。
詳しくはググったらいくつか記事が出てきます。

X,Y,Zのうち、任意の一面のみを情報源とするならPlanar、全部を使う場合はTriplanarと言われます。
今回は服の柄につかうことを考えているので、全体ぐるりを考える必要はなく、前面だけ絵が出れば十分なので只のPlanarでいきます。

説明はこれくらいで、作ったシェーダー紹介するよ。

シェーダのパラメータは6つです。

f:id:onoty3d:20180801171450p:plain
Color: 下地になるカラー
MainTex: 下地になるテクスチャ
Decal Color: デカールのカラー
Decal: デカールテクスチャ
Decal Planar: デカールを表示する面
Decal Side: デカールを表示する側

 Decal Planarは、X,Y,Zどの表面にデカールを出すかを設定します。
モデルのローカルの向きが基準になるので切り替えて確認してみてください。

Decal Sideは、任意の面のうち、表と裏どちら側にデカールを出すかを設定します。
服の前後に同じ絵柄が出てると変だもんね?
Frontだと手前のみ、Backだと裏のみ、Bothだと両方に表示します。
Tシャツの装飾だと手前のみ、が多いかな?
両側に別の絵を出したい、とかいう時は改造しよう。

DecalテクスチャはTilingとOffsetでサイズと位置調整が出来ます。
絵を一つだけ出す場合は、テクスチャのWrap ModeをClampにしましょう。

f:id:onoty3d:20180801171716p:plain
絵を出したい面で、テクスチャが左右反転とか上下反転している場合は、Tilingの値の正負を入れ替えたりするといい感じになります。

f:id:onoty3d:20180801171732p:plain

あと細かい機能が欲しい場合は好きに改造してください。
Unlit版のシェーダーを公開しておきます。

UTS2への移植版は後ほどFANBOXで公開します(※公開しました)。

www.pixiv.net


もちろん手動でUnlit版のコードを移植すれば自力で作れます。

f:id:onoty3d:20180801172412p:plain