Skip to content

Toon本体に3段階の影設定とパック済みShade Mask / AOを追加する #59

Description

@PenguinDOOM

目的

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は #60lightColor / 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モジュールから拡張できる境界を維持する。

完了条件

  • #60と#61が完了している。
  • 1st ShadeのColor / Border / Blur / Strengthを設定できる。
  • 2nd Shadeを有効化し、Color / Border / Blur / Strengthを設定できる。
  • 3rd Shadeを有効化し、Color / Border / Blur / Strengthを設定できる。
  • R / G / Bを各Shade Maskとして利用できる。
  • Aを全Shade共通のBaked AO入力として利用できる。
  • Shader-Coreの [SCMask] から4入力を1枚のRGBAマスクへ編集・生成できる。
  • マスクRGBAはシェーダー側で1サンプルから利用される。
  • Blur 0でハードなToon境界を表現できる。
  • UnityのリアルタイムShadowが独立visibilityとして1st / 2nd / 3rd Shadeへ作用する。
  • ShadowMap境界によってToonのlight directionが変化しない。
  • Shadow Environment Strength = 0 で環境光に左右されず設定したShade Colorを維持できる。
  • Shadow Environment Strength > 0 で環境光に応じて影色を明部側へ戻せる。
  • 現在の固定二値Toon陰影を再現できる設定が存在する。
  • ForwardBase / ForwardAdd / realtime Shadow / SH environmentとの組み合わせ仕様が明確になっている。
  • ShadowCasterおよびLightmapの既存契約を壊さない。
  • 公開プロパティABIとシェーダー契約を更新する。
  • 1段 / 2段 / 3段、マスク有無、AO有無、Shadow有無、環境光強弱の代表的な描画回帰テストが通る。

スコープ外

  • 段ごとの独立AO Map
  • 顔向けSDF Shadow
  • Shadow LUT
  • 深度ベース / Screen Space AO
  • 段ごとの独立UV・タイリング
  • 高度なBorder Mask / Blur Mask等の追加制御

これらは必要に応じてShader-Coreモジュールとして追加する。

Metadata

Metadata

Assignees

Labels

enhancementNew feature or request

Projects

No projects

Relationships

None yet

Development

No branches or pull requests

Issue actions