ToonMaster 開発過程まとめ - LHYAYOI/HujiTV GitHub Wiki

ルック開発から専用データ・動作検証まで

作成日:2026-08-28~現在 |hatakeyama gaku| Unity 6000.3.23f1 / URP 17.3 | 対象:Arknights Endfield -Yvonne- / ToonMaster_001

本資料は、制作過程を再整理したものです。新しい描画結果ではなく、既存キャプチャのレビューです
バージョンはマテリアル更新処理の番号で、撮影日時ではありません
公式コード・顔SDF・専用材質マスクを入手して再現したものではありません

概要:顔・目の参照修復から、材質別の陰影と反射、髪の中間色、眉・瞳の透かしへ改善
その後、専用材質マスク、推定毛流れマップ、髪ハイライトの平滑化を追加しました。

現状:描画経路と調整機能は実装済み。全領域のマスク仕上げ、半透明部の処理、毛流れのアート調整、実時間のちらつき評価は継続課題です。


1. 完成形 — Review_MaterialComparison

左:ToonMaster_001、右:URP Lit

左:ToonMaster_001 / 右:URP Lit
同じモデルと静止ポーズを共通のカメラ・照明で比較するために用意したシーンです。
左は顔の陰影を整理し、右は鼻・目の周囲などに立体形状に沿った陰影が強く出ています
髪と衣装は、単純に影を二段化するだけでなく、部位別の反射を使い分ける方針です

生成処理はLit側へBase Map、Base Color、UV変換、Normal Map、Metallic、Roughnessから求めたSmoothnessなどを初回作成時に転記します
Toon専用の顔法線補正・髪の反射・アトラス領域補正はLit側にありません

2. 目標ルックの定義

目標は、『アークナイツ:エンドフィールド』のYvonne画像を参考に、アニメ的に整理した顔と、立体感・材質差のある髪と衣装を両立することでした
以下は制作上の目標整理であり、公式シェーダーの仕様を示すものではありません

部位 目標 見るポイント
顔 明るく読みやすい面、暖色寄りの影 鼻・口の細かい凹凸が黒ずみとして目立たない
瞳 虹彩の色・模様を保つ 影や遮蔽で瞳が潰れず、肌のテクスチャを誤って使わない
髪 ローズピンクの基調、赤紫の暗部、毛束に沿った光沢 全体が白っぽくならず、明部・中間色・暗部を読める
衣装 布・革・金属を区別 白い布を金属扱いせず、袖の描き込みと追加反射が過剰に重ならない
照明への応答 正面以外でもキャラクターとして成立 横光・逆光で髪の色、顔、衣装の輪郭を確認する

制作時の参照先:

3. 改善の全体像

段階 課題 修正の中心
初期 → V2 元マテリアルの残存、目の参照問題、強すぎる陰影 8スロットの再割当、虹彩テクスチャ、目・顔の個別調整
V3.2 髪が白っぽい、衣装の材質差が弱い 色付き髪反射、陰影の連続性、布・革・金属の分離
V4.1 鼻・口の陰影、袖と胸の描き込み光沢 頭方向を使う顔法線補正、UV領域による光沢抑制
V5 無彩色の布や革まで金属になる 無彩色推定を停止、銀色トリムをUV領域で限定
V6 髪の中間色とハイライトの形が弱い 中間色、主ハイライトの帯、副ハイライトの抑制
後続拡張 前髪で眉・瞳の読みやすさが下がる 髪深度+対象深度+色パスで部分的な透かし

4. 目の参照修復と顔の読みやすさ

問題と修正

元glTFの画像URIが実ファイルの配置と一致していなかったこと、シーンに元マテリアルが残っていたことを記録しています。対応は、画像参照の修復、8スロットへのToonマテリアルの明示的割当、虹彩専用のiris_01_d.pngの接続です。未知のマテリアルへ顔テクスチャを代用する処理をやめ、Base Mapが空の既存マテリアルも再接続するようにしました。

虹彩テクスチャは非圧縮・sRGBで扱い、目の影・遮蔽・リムを抑制。V2ではAlbedo Preservationを0.65、V3.2では0.5に調整しています。元UVは保持しました

目・顔の改善前として保存された画像

目・顔の改善後として保存された画像

画像で確認できる変化: 鼻・口の暗い陰影が弱まり、顔が平面として読みやすくなっています。髪の白っぽさも減っています。

比較の注意: Beforeにも虹彩が描かれています。この2枚は「テクスチャ欠落→復旧」の証拠画像ではなく、目・顔・髪の見た目の累積的な改善例です。撮影条件と適用バージョンの完全な対照記録は残っていないため、全差分を1つの修正だけに帰属させません。参照修復そのものはYvonne-validation.jsonの虹彩パス・8スロット検証で確認できます。

5. V3.2 — 色と材質の分離

V3前:髪と脚が明るく、袖の光沢が強い状態 V4前の保存画像:V3.2段階の上半身

修正手法

  • 陰影の混合: 段階的なToon影と連続的な陰影を混ぜ、脚・衣装の丸みを残しました。主な設定は_DiffuseRoundness。
  • 髪の色と反射: 基調色をローズピンク、影を赤紫へ。狭い主ハイライトと弱い副ハイライト、ピンク寄りの反射色を導入しました
    方向は専用毛流れマップではなくUVのV方向から推定します
  • 材質の分離: 同じcloth_01を使うメッシュをLeggings / Gear / Jacketに分け、UV・元テクスチャは保持したまま、反射の強度と粗さを個別調整しました
  • 環境反射: キューブマップによるFresnel反射を追加し、プレビューにスタジオ用の反射環境を設定しました

見た目は全体を明るくする方向から「髪の色を残し、部位ごとの反射を使い分ける」方向性に

6. V4.1 — 顔の陰影と描き込み光沢を整理

V4前:鼻口の陰影と袖の描き込みを確認

V5前:V4.1段階の保存画像

顔:照明用の法線を頭の前方へ寄せる

_FaceNormalBlendを顔で0.6に設定
形状の凹凸をそのまま照明に使う割合を下げ、鼻・口元の小さな暗部を抑えました。ToonFaceFrameが頭方向をMaterialPropertyBlockで渡すため、Animatorによる頭の回転にも追従します
メッシュ形状を平らにする処理ではなく、顔SDFでもありません

衣装:追加の反射と、テクスチャ内の光沢を分ける

袖や胸には、元の色テクスチャ自体に光沢に見える明暗があります。Specularを下げるだけでは消えないため、cloth_01の対象領域をUV矩形で指定し、_BakedHighlightReduction=0.7で色計算時に弱めました
同時に_FabricSpecular=0.12で布領域の追加反射を抑えています。

元画像は変更していません。画像の明るさからの推定補正なので、描き込みを完全に除去した拡散色には戻せません。上の比較でも袖の明るい線は残っています

7. V5 — 金属の誤判定をやめる

V5前:無彩色を金属候補にする段階

V6前:V5段階、革と銀色トリムを分けた状態

初期の「無彩色に近い画素は金属」という推定は、白い布・暗い革も拾うため停止しました。_NeutralMetallic=0とし、Gearの銀色トリムを_MetalRegionA/B/Cの3つのUV矩形で指定。境界は0.008 UV幅でぼかします。

金属領域には専用のMetallic=0.85、Roughness=0.25、Specular=0.7を使用。残りのGearはRoughness=0.52、Specular=0.18として、革の幅広い反射と区別しました
画像では肩の黒い装備などの反射の出方が変わっています。

これはYvonne用の暫定領域指定で、全金具を網羅する専用マスクではありません
また、既存ToonFaceFrame.headを修復時に保持し、頭ボーンがルートへ置き換わる問題も防ぎました

8. V6 — 髪の明部・中間色・暗部を整える

V6前:従来の髪反射

V6到達画像:中間色とハイライト帯の追加

髪に_HairMidtone=0.8と中間色を追加。_HairHighlightBand=0.65で異方性ハイライトの帯を整えました
主反射はSpecular=0.46、副反射は0.045に調整し、反射色も淡いピンクへ寄せています

画像では頭頂から前髪の明部がまとまり、暗い毛束との区別が明確になっています
白い反射を一律に強めるのではなく、中間色と主・副ハイライトの役割を分けた修正です
掲載値はV6の初期適用値

横光・逆光での確認

横光での確認

逆光での確認

照明を動かした検証用画像です
横光では毛束と衣装の陰影、逆光では暗部に残る髪色と顔の視認性を見ます
バージョンの前後比較ではありません

9. 後続拡張 — 前髪越しの眉・瞳

眉の透かしOFF

眉の透かしON

髪を全体的に半透明にすると髪の量感まで変わるため、眉・瞳だけを対象に描画を追加しました

  1. 髪の深度を専用テクスチャに記録
  2. 対象の眉・瞳をZWrite On / ColorMask 0で専用深度へ描画
  3. ZTest Equalで一致する面に色をブレンド
  4. シーン深度と髪深度を比較し、手前の遮蔽物が髪で、距離条件を満たすときだけ透かす

Yvonneの眉にはUV4.xの頂点マスクを追加し、元UV0・テクスチャ・スキニングを保持。頭の正面から外れると効果を弱めます。これをURPのToonFeatureRevealが順序指定して描画します

通常の正面では瞳が髪に隠れていない箇所もあり、差が小さく見えます

10. 改善から得た設計上の判断

課題の種類 採った手法 避けた解決の仕方
参照の不整合 スロット・テクスチャ・UVを確認して修復 明るさだけで目の欠落を隠す
顔の複雑な陰影 顔だけ照明用法線を補正 全身の影を一律に消す
材質の差が弱い 部位分離と局所設定 全身に同じSpecularを設定する
元画像の光沢 アトラス内の限定領域で補正 反射パラメーターだけで除去できると考える
金属の誤分類 明示したUV領域へ置換 白・灰色をすべて金属にする
前髪の遮蔽 対象深度と髪深度で限定描画 壁まで透ける無条件の最前面描画

11. 専用材質マスク — 金属・布・補正範囲をデータ化

V5のUV矩形指定を発展させ、Yvonne_SurfaceMask.assetを追加しました。1024×1024、線形、非圧縮、ミップ付きのデータテクスチャです。

チャンネル 用途 適用範囲
R 金属領域 既知の銀色トリム3領域を多角形で指定。金属設定が有効なGearへ適用
G 布領域 袖の反射・粗さ調整
B 描き込み光沢の補正領域 袖・胸の補正を限定

専用材質マスク適用前・左Toon/右Lit

専用材質マスク適用後・左Toon/右Lit

狙い: 色が白い・灰色という理由で金属にするのを避け、対象を明示したデータへ移すことです
現在は既知領域に絞った初版なので、画面全体の変化は小さくなっています
全金具の分類完了を示すものではありません。

変更方法: 元画像・UV・既存の材質調整値は保持。Use Authored Surface MaskをOFFにすると従来のUV矩形方式へ戻ります
従来のMask Map(光沢・AO・リム)とは別です。

検証: シェーダーコンパイル、代表的な銀色トリムが金属マスクに含まれること、白い脚の布が除外されることを確認
同一カメラ・照明でBefore / Afterを保存しました

12. 毛流れマップ — 反射方向を局所的に補正

従来はUVのV方向だけを毛流れとしていました
追加したYvonne_HairFlow.assetは512×512、線形、非圧縮、ミップ付き
RGに方向、Bに推定の確信度を保存します

生成と適用

  1. 元の髪テクスチャから輝度勾配を取得
  2. 7×7の近傍で方向を集計し、線に沿う向きを推定
  3. UVのV方向からの補正角を約14度以内へ制限
  4. 勾配が弱い領域や横向きの境界では確信度を下げる
  5. シェーダーで従来方向と混合し、髪の異方性反射へ適用 横光・毛流れ補正OFF

横光・毛流れ補正ON

正面寄りの照明・毛流れ補正後

設定: Hair Flow Strength=0.65で初期適用0で従来方式へ戻ります   法線マップや形状そのものを変更する処理ではありません

注意: テクスチャの線から推定した初版で、手描きの毛流れや公式データではありません 描き込み照明、UV境界、重複UVでは誤推定が起こり得ます
「専用マップを用意したこと」と「毛束ごとのアート調整が完了したこと」は別と考える

13. 動作検証と調整値の保持

歩行+頭回転の代表姿勢・フレーム0

歩行+頭回転の代表姿勢・フレーム44

歩行クリップに頭の上下・左右回転を加えた90姿勢をサンプリングし、髪のスキニング結果を検証しました
全頂点に非数値・無限値がないこと、静止したままではなく実際に変形していることを確認しています

毛流れデータの再生成では、既存の強度と差し替えたマップ参照を保持するよう修正しました
新規の髪マテリアルを作成・修復する場合は、マップが存在すれば初回だけ接続します

14. 髪ハイライトの平滑化

細い光沢は、カメラ移動や縮小で画素をまたぐと点滅しやすくなります。この対策としてHair Highlight Antialiasingを追加しました。

近距離・ハイライト平滑化OFF

近距離・ハイライト平滑化ON

縮小表示・ハイライト平滑化OFF

縮小表示・ハイライト平滑化ON

修正手法

  • 画素内の反射方向の変化量を微分から求める
  • 変化が大きい場所では、主・副ハイライトを広げてピークを抑える
  • ハイライト帯の境界にも画素幅に応じた平滑化を適用

既存Yvonneの髪では1に設定し、0で従来式に戻せます
追加の描画パス・テクスチャ参照はなく、微分と算術計算を追加しています

確認済み: 近・中・遠に相当する3段階の表示サイズでON/OFF画像を生成し、シェーダーコンパイルを確認しました

未確認: 実時間のちらつき減少率やGPU時間は未計測です。これは時間的蓄積ではなく、空間的な平滑化です 髪の輪郭、ポリゴン、UV境界に起因するちらつきまでは解決しません

15. 残る課題と次の優先順

優先 課題 次の作業・完了の判断
1 実時間のちらつき評価 同一カメラ軌道の動画で平滑化ON/OFFを比較。輪郭と光沢の変化を分離して判断
2 材質マスクの細部 全金具・布・革をUV上とモデル上で照合し、誤分類を修正
3 毛流れの手動仕上げ 頭頂・前髪・長い毛束ごとに方向を確認。アトラス境界の誤推定を修正
4 描き込み光沢 元画像の光沢と追加反射を分離して素材を調整。模様を損なわないことを確認
5 顔の陰影設計 顔SDFなどの専用データを検討し、光源を回した際の影形状を設計
6 形状と変形 髪のシルエット、表情、肩・腰・衣装ウェイトを大姿勢で仕上げる

到達点: 材質ごとのルック制御と、専用データを使って仕上げるための経路を整えました。専用マスク・毛流れマップは初版であり、公式の見た目を完全に再現したという結論ではありません。

主な編集先:

  • シェーダー:Assets/ToonMaster/Shaders/ToonMaster_001.shader
  • 材質の初期設定・修復:Assets/ToonMaster/Editor/YvonneMaterials.cs
  • 材質マスク生成:Assets/ToonMaster/Editor/YvonneSurfaceMaskBuilder.cs
  • 毛流れ生成・検証:Assets/ToonMaster/Editor/YvonneHairFlowBuilder.cs
  • マテリアル・データ:Assets/ToonMaster/Materials/
  • 詳細仕様:Assets/ToonMaster/README.md、Assets/ToonMaster/Rendering/README.md、Assets/LightShaft/README.md

16. 資料の読み方と証跡

本資料は2026-09-18時点の保存コード・README・画像・検証記録を整理したものです。前半のV2〜V6はマテリアル移行処理のバージョンであり、日付ではありません。

初期画像は撮影条件が一致しないものを含みます。特に目のBefore画像にも虹彩が描かれているため、「テクスチャ欠落そのもののBefore」とは扱いません。後続のマスク・毛流れ・平滑化では、専用のON/OFF比較を保存しています

資料内の画像は元キャプチャを使い、見た目を加工していません