lilxyzw NonToon に、NonToon 本体に存在しない機能を Shader Core モジュールとして追加するパッケージです。
すべてのシェーダーコードは Poiyomi のコードを流用しない独自実装 (クリーンルーム) です。数式は一般に知られた公開手法 (グレー軸まわりの色相回転行列、fract-sin ハッシュ等) のみを使用しています。
| モジュール | uniqueID | 内容 |
|---|---|---|
| エミッション | jp.rroki.nontoon.emission | 発光。HDR カラー / 強度 / マップ (タイリング・UV0-3・スクロール) / アルベド乗算 / 共有マスクチャンネル / 正弦波点滅 |
| 色調整 | jp.rroki.nontoon.coloradjust | メインカラーの色相 / 彩度 / 明度 / ガンマ補正 (Details より前に適用) |
| グリッター | jp.rroki.nontoon.glitter | ハッシュベースのスパークル。グリッド密度 / 輝点割合 / 丸い輝点サイズ / 視線・光源角依存の煌めき / 明滅速度 / HDR カラー |
| ディゾルブ | jp.rroki.nontoon.dissolve | ノイズ閾値でピクセルを消去 (clip) + 境界の HDR 発光。base フェーズなので影/深度パスでも欠落し、不透明マテリアルでも動作 |
| オクルージョン (AO) | jp.rroki.nontoon.occlusion | くぼみを常に暗くする静的 AO。指向性のトゥーン影とは独立。Ramp (ランプ連動) / Multiply / Light の 3 モード、専用マップ or 共有マスク、Strength / 常時最小の暗さ (Floor) / Invert |
| 環境リフレクション | jp.rroki.nontoon.envreflection | リフレクションプローブのサンプリング (ラフネス連動ミップ + Schlick フレネル)。本体の _Roughness を共有。金属向けのアルベド色反射に対応 |
| クリアコート | jp.rroki.nontoon.clearcoat | コート専用の滑らかさを持つ第2ローブ。直接光ハイライト (GGX + Kelemen 可視項) + シャープな環境映り込み。ベース反射と独立して調整可能 |
| ハイトマップ視差 | jp.rroki.nontoon.heightparallax | POM。視線角に応じた動的ステップ数 + 交点の線形補間でベース/マスク/ノーマルを再サンプル (base フェーズ先頭)。専用マスクテクスチャで視差の適用範囲を限定可能 |
| 内部パララックス | jp.rroki.nontoon.internalparallax | 模様が表面の下に沈んで見える表現。Heightmap (RGB=色 / A=高さ、置き換え or ライト加算) と LayerAlpha (多層合成) の 2 モード、最大 32 レイヤー。色ソースに MatCap (ビュー依存の球面マップ) を選択可能 (宝石/クリスタル/瞳の内部表現向け。Texture / MatCap / Multiply、色相シフト・視差連動付き) |
| デカール | jp.rroki.nontoon.decal | 位置 / スケール / 回転指定のテクスチャ合成 ×4 スロット。Replace/Multiply/Add ブレンド + エミッションオプション |
| マットキャップ (追加) | jp.rroki.nontoon.matcapsextra | NonToon 標準 MatCaps (乗算/加算 各1) に加えて、もう 1 組の乗算/加算スロットを追加 |
| バックフェース | jp.rroki.nontoon.backface | 裏面 (isFront=false) のみアルベドを別色/別テクスチャに差し替え。二重構造の服の裏地向け。Tint / Replace、アルファ置換、色相シフト、エミッション。base フェーズなので裏面も表面と同じ光/影を受ける |
postpixel フェーズ (ライティング合成後の加算) で DistanceFade より前に、環境リフレクションは reflection フェーズで動作します。いずれもアウトラインパスでは無効ですNonToon の .scshader を選択し、インスペクターのモジュール一覧から各モジュールにチェックを入れて Apply してください (Shader Core のプロジェクト設定に保存されます)。
Poiyomi to NonToon Converter (jp.rroki.poiyomi-to-nontoon) がインストールされていると、変換時に以下が自動で引き継がれます:
| Poiyomi | 引き継ぎ先 |
|---|---|
| Emission 0 (色 / 強度 / マップ / マスク / 点滅 / UV パン) | エミッションモジュール |
| Color Adjust (彩度 / 明度 / ガンマ) + Hue Shift | 色調整モジュール |
| Glitter (色 / 明るさ / グリッド / 密度 / サイズ / コントラスト / 速度 / サーフェスカラー) | グリッターモジュール |
| Dissolve (ノイズ / 溶解量 / UV / スクロール / 反転 / 境界発光 / マスク) | ディゾルブモジュール |
| Occlusion Map (マップ / チャンネル / 強度) | オクルージョン (AO) モジュール |
| Mochie PBR / lilToon スタイルの環境リフレクション | 環境リフレクションモジュール |
| Clear Coat (滑らかさ / ハイライト / 映り込み / コートマスク) | クリアコートモジュール |
Parallax Height Mapping (_HeightMap / 強度 / ステップ数 / ハイトマスク) | ハイトマップ視差モジュール (マスクは専用テクスチャで引き継ぎ) |
| Internal Parallax (マップ / 深度範囲 / レイヤー数、専用マスクは高さ (A) へベイク) | 内部パララックスモジュール |
| Decal 0-3 (位置 / スケール / 回転 / 色 / ブレンド / タイリング / エミッション、マスクはアルファへベイク) | デカールモジュール |
| MatCap スロット 3/4 | マットキャップ (追加) モジュール |
| BackFace (色 / テクスチャ / 色相 / エミッション / アルファ置換) | バックフェースモジュール |
必要なモジュールの有効化 (Shader Core プロジェクト設定) も変換時に自動で行われます。 コンバーターが無い環境ではシェーダーモジュールのみが機能します (連携コードはコンパイルされません)。
顔を SDF 影、体を AO/NdotL で塗ると、メッシュの境目 (首元) で影が不連続になりがちです。原因は 「指向性の影 (SDF / NdotL、光で動く)」と「静的なオクルージョン (AO、光で動かない)」という別種の量を混同する ことにあります。影マスクを境目でフェードすると、一番奥まっているはずの首まで明るくなってしまいます。
考え方は 2 つを分離することです:
Ramp (既定) なら
AO が Shade のトゥーンランプの影側へ流れ込み、ベタ黒でなくランプの影色になります。以前作った
「境目に向かうグラデーションマスク」は、影のフェード用ではなく AO (暗くする) として Source = SharedMask /
Invert / Min Darkness (Floor) で流用できます。首を十分な AO で暗くすると、SDF と NdotL の指向性のズレが
影の中に隠れて見えなくなります (これが実務上一番効きます)。Tools > rroki_'s tools > NonToon に、手描きせず首元フェードマスクを作れる 2 ツールを同梱しています (コンバーター非依存)。
首元フェードマスク生成: 首元を基準に UV グラデーションマスクを自動生成。首元は必ずしもメッシュの穴では ないため (頭部が閉じている場合が多い)、フェードの基準を選べます:
フェード距離/カーブを調整でき、距離の既定値はメッシュ寸法から自動設定 (スケールされたアバターでも初回から見える)。
シーンビューにヒートマップ表示。生成して SDF Neck Fade Baker へ送る で次のツールへ直接受け渡し。
SDF Neck Fade Baker: SDF マップと上記マスクを受け取り、B チャンネルへ合成 (Max / Lerp→1 / Add) した 新しい SDF マップを出力。出力を NonToon マテリアルの SDF Map に差し替えるだけ (シェーダー変更・ランタイムコスト不要)。
Occlusion モジュールの Mode は、Shade (トゥーンランプ) を使うマテリアルは
Ramp、使わないマテリアルはMultiplyを選んでください。Lightは直接光+環境を一律に暗くします。
各モジュールの _Enable は [SCConstValue] (シェーダーキーワード) です。モジュールが無効なマテリアルでは、その機能のコードごとコンパイルから除外されるため、無効モジュールのパラメータをアニメーションしても VRChat 上で一切変化しません。アニメーションさせたいモジュールは有効化 (Apply) しておくか、下記 Composer の自動有効化を使ってください。ON/OFF トグルは _Enable ではなくパラメータ側を中立値へ動かします (例: エミッション強度を 0)。
色相回転は角度 = shift × 2π なので 0 と 1 は同じ色です。色調整 (_Adjust...Hue) / エミッション (_..._EmissionHueShift) / 追加マットキャップ (_..._MatCapHueShift) の色相は、0→1 を等速で動かすとシームレスにループします。速度プロパティ (...HueSpeed 等) を使えばクリップ無しでシェーダー時間により回り続けます (追加マットキャップの色相はスロット 3/4 用)。
Animation Composer (Tools > rroki_'s tools > NonToon > Animation Composer) — アバターをスキャンし、検索可能なプロパティ一覧から複数プロパティ×複数メッシュを一括選択してクリップ生成 (色相ループ 0→1 / A→B フェード / A→B→A 往復)。対象モジュールの _Enable を自動有効化するため、上記のストリップ問題を回避できます。Poiyomi 用の既存クリップは Poiyomi → NonToon Animation Retarget (poiyomi-to-nontoon 同梱) でプロパティパスを変換できます。
_ParallaxMask (+チャンネル/反転) で適用範囲を限定できます (既定 white なら全面)Ramp モードは Shade (トゥーンランプ) を使うマテリアルでのみ効きます (Shade 未使用なら Multiply)。指向別 (直接光のみ減衰など) の分離には非対応ですVCC / ALCOM にリポジトリを追加してください:
https://rroki-0u0.github.io/vpm-repos/index.json
jp.rroki.nontoon-extra-modules
https://github.com/rroki-0u0/vpm-repos
0.2.2
2022.3 or later
No dependencies
No legacy packages