目的
PureBase/Toon の現在の step(0, dot(N, L)) による固定二値陰影を、マテリアルから調整可能な最大3段階のToon陰影へ拡張する。
基本的な多段影はPure Base本体で完結させ、Shader-Coreモジュールを追加しなくても一般的なToon表現を構成できるようにする。一方、顔向けSDF影やLUTなど特殊な影方式は引き続きモジュール側へ委ねる。
このIssueで扱う「影」はShadowCasterや深度ベースAOではなく、主に法線とライト方向から生成するToon shadingを指す。
依存
#59ではリアルタイムShadow visibilityとSH lightingの基盤を作り直さず、#60 / #61で確定した入力契約を利用して3段Shadeへ接続する。
対象
PureBase/Toon
Shaders/Models/toon.hlsl
- Toon用Material Inspector UI
- Shader-Coreの
[SCMask] を利用したマスク編集・チャンネルパッキング
- ForwardBase / ForwardAddのToon直接光
- リアルタイムShadow visibilityのShade判定への適用
- Shadow Environment Strengthによる環境光の影響制御
- 公開プロパティ、シェーダー契約、テスト
基本仕様
最大3段階のShadeを本体に持たせる。
各段について少なくとも次を設定可能にする。
- Shade Color
- Border / Threshold
- Blur / Feather
- Strength
1st Shadeは基本機能として常時利用可能にし、2nd / 3rd Shadeは個別に無効化できる構成を検討する。
現在の固定式:
step(0, dot(shadingData.N, light.direction))
を、各段のBorder / Blur等から段階的なToon応答を生成できる構造へ置き換える。
Realtime Shadow
UnityのリアルタイムShadowは #60 で lightColor / lightDirection から分離された独立shadow / visibility入力を使用する。
- ShadowMap visibilityによってToonの支配ライト方向を変化させない。
- Shadow visibilityによってScene / direct light colorそのものを直接黒へ潰さない。
- Shadow visibilityは1st / 2nd / 3rdのShade判定を影側へ寄せる入力として扱う。
- 各段でShadow Receive Strengthを個別に持つか、全段共通値にするかを実装前に決定する。
- ShadowCaster Passは影を「落とす」処理であり、本項の影を「受ける」処理とは独立させる。
Environment / SH
#61でOpenLit 1.0.2相当へ整理したSH bright / dark lightingを前提とし、Shade Colorへ環境光をどの程度反映するかを設定可能にする。
Shadow Environment Strength
全Shade共通の Shadow Environment Strength を追加する。
想定仕様:
0: 環境光によって設定したShade Colorを持ち上げない。lilToonの既定値相当。
1: indirect / environment lightingに応じてShade Colorを明部側へ戻す。
- 既定値は
0 を基本とする。
環境光はShade Colorそのものへ直接乗算して暗くするのではなく、lilToonと同様に「影色をどれだけ明部へ戻すか」という独立制御として扱う方向を基本とする。
Shade Mask / AO
3段分のShade Maskと共通AOを1枚のRGBAテクスチャへまとめる。
想定チャンネル:
- R: 1st Shade Mask
- G: 2nd Shade Mask
- B: 3rd Shade Mask
- A: Shared AO
Shader-Coreの [SCMask] を使用し、Inspector上では各用途へ別々の入力テクスチャを指定できるようにしつつ、実行時は1枚のパック済みテクスチャとしてサンプルする。
Shared AO
AチャンネルのAOは1st / 2nd / 3rdで共通利用する。
- ベイク済みAOテクスチャをそのまま利用しやすい仕様を優先する。
- lilToonのようなRGB別の段別AO制御はPure Base本体では持たない。
- 白をAO影響なし、暗いほど影側へ寄せる直感的な規約を基本とする。
- AOは深度や画面空間から遮蔽を計算する機能ではなく、Toon陰影判定を影側へ寄せるための入力として扱う。
- 段ごとの個別AOが必要な場合は将来Shader-Coreモジュールとして拡張可能にする。
設計事項
実装前に次を確定する。
- 3段のBorder値の順序と、不正な順序をInspectorまたはHLSL側でどう扱うか。
- Blurの定義と、
0 で完全なハードステップを再現できること。
- Shade Colorをアルベドへ乗算するか、別の合成方式を採用するか。
- Strengthの意味を最終Shade量に対する係数として統一するか。
- Shade Maskの
0 / 1 の意味と、Strength・Border・AOのどの段階へ適用するか。
- Shared AOが各段のBorder判定へ共通バイアスとして作用するか、別の合成方法を使用するか。
- 2nd / 3rd無効時に不要な計算を最小化する方法。
- ForwardAddで多段Shadeをどこまで適用し、既存の追加ライト合成契約を維持するか。
- #60の独立Shadow visibilityを各Shadeへどのように作用させるか。
- Shadow Receive Strengthを段別にするか共通にするか。
- #61のSH bright / dark値と
Shadow Environment Strength の合成位置。
- 環境光が強い場合でも
Shadow Environment Strength = 0 なら指定したShade Colorを維持できること。
- 現在のPure Base Toonの描画を再現できる既定値または互換設定を用意すること。
実装要件
- #60完了後のshadow / visibility契約を利用し、attenuationを再びlightColor / lightDirectionへ混ぜない。
- #61完了後のOpenLit相当SH計算を利用し、#59内で別のSH近似を重複実装しない。
- Shade Mask / AOは原則1回のテクスチャサンプルでRGBAを取得する。
- マスクは共通UVを使用し、段ごとの独立UVや独立タイリングは本体仕様に含めない。
- 2nd / 3rdを使用しないマテリアルでも不要なテクスチャ追加を要求しない。
Shadow Environment Strength = 0 では環境光によるShade Colorの持ち上げを行わない。
- Ambient / baked environment lightingの所有権を明確にし、Lightmapを二重加算しない。
- ShadowCaster Passの役割と混同しない。
- 特殊な影表現を本体へ過剰に取り込まず、Shader-Coreモジュールから拡張できる境界を維持する。
完了条件
スコープ外
- 段ごとの独立AO Map
- 顔向けSDF Shadow
- Shadow LUT
- 深度ベース / Screen Space AO
- 段ごとの独立UV・タイリング
- 高度なBorder Mask / Blur Mask等の追加制御
これらは必要に応じてShader-Coreモジュールとして追加する。
目的
PureBase/Toonの現在のstep(0, dot(N, L))による固定二値陰影を、マテリアルから調整可能な最大3段階のToon陰影へ拡張する。基本的な多段影はPure Base本体で完結させ、Shader-Coreモジュールを追加しなくても一般的なToon表現を構成できるようにする。一方、顔向けSDF影やLUTなど特殊な影方式は引き続きモジュール側へ委ねる。
このIssueで扱う「影」はShadowCasterや深度ベースAOではなく、主に法線とライト方向から生成するToon shadingを指す。
依存
#59ではリアルタイムShadow visibilityとSH lightingの基盤を作り直さず、#60 / #61で確定した入力契約を利用して3段Shadeへ接続する。
対象
PureBase/ToonShaders/Models/toon.hlsl[SCMask]を利用したマスク編集・チャンネルパッキング基本仕様
最大3段階のShadeを本体に持たせる。
各段について少なくとも次を設定可能にする。
1st Shadeは基本機能として常時利用可能にし、2nd / 3rd Shadeは個別に無効化できる構成を検討する。
現在の固定式:
を、各段のBorder / Blur等から段階的なToon応答を生成できる構造へ置き換える。
Realtime Shadow
UnityのリアルタイムShadowは #60 で
lightColor/lightDirectionから分離された独立shadow / visibility入力を使用する。Environment / SH
#61でOpenLit 1.0.2相当へ整理したSH bright / dark lightingを前提とし、Shade Colorへ環境光をどの程度反映するかを設定可能にする。
Shadow Environment Strength
全Shade共通の
Shadow Environment Strengthを追加する。想定仕様:
0: 環境光によって設定したShade Colorを持ち上げない。lilToonの既定値相当。1: indirect / environment lightingに応じてShade Colorを明部側へ戻す。0を基本とする。環境光はShade Colorそのものへ直接乗算して暗くするのではなく、lilToonと同様に「影色をどれだけ明部へ戻すか」という独立制御として扱う方向を基本とする。
Shade Mask / AO
3段分のShade Maskと共通AOを1枚のRGBAテクスチャへまとめる。
想定チャンネル:
Shader-Coreの
[SCMask]を使用し、Inspector上では各用途へ別々の入力テクスチャを指定できるようにしつつ、実行時は1枚のパック済みテクスチャとしてサンプルする。Shared AO
AチャンネルのAOは1st / 2nd / 3rdで共通利用する。
設計事項
実装前に次を確定する。
0で完全なハードステップを再現できること。0/1の意味と、Strength・Border・AOのどの段階へ適用するか。Shadow Environment Strengthの合成位置。Shadow Environment Strength = 0なら指定したShade Colorを維持できること。実装要件
Shadow Environment Strength = 0では環境光によるShade Colorの持ち上げを行わない。完了条件
[SCMask]から4入力を1枚のRGBAマスクへ編集・生成できる。Shadow Environment Strength = 0で環境光に左右されず設定したShade Colorを維持できる。Shadow Environment Strength > 0で環境光に応じて影色を明部側へ戻せる。スコープ外
これらは必要に応じてShader-Coreモジュールとして追加する。