Skip to content

ToonのShadow attenuationをlightColor / lightDirectionから分離する #60

Description

@PenguinDOOM

目的

PureBase/Toon でUnityのリアルタイムShadow attenuationがToon用のライト色と集約ライト方向へ直接混入し、Soft Shadow境界で不自然な明暗や方向変化が発生する問題を修正する。

Toonではリアルタイム影を「光そのものを消す値」として扱うのではなく、Toon Shade判定を影側へ寄せる独立したvisibility / shadow入力として扱える構造へ変更する。

現状の問題

Shader-Core BIRP lightingではメインライトが概念的に次の形で渡される。

light.color = _LightColor0.rgb * attenuation;

Pure Base Toonはその light.color を直接光だけでなく集約ライト方向の重みとしても使用しているため、Shadow attenuationが変化すると次の両方が同時に変化する。

  • Toonの直接光強度
  • Toonの支配ライト方向

Soft ShadowのPCF境界ではattenuationが連続的に変化するため、ShadowMapの形状がToonのN·L境界やライト方向へ漏れ、不自然な波打ち・暗化が発生する。

期待する設計

Toonのライティング入力を少なくとも次の責務へ分離する。

  • Scene / direct light color
  • Toon用light direction
  • distance / spot attenuation
  • realtime shadow visibility
  • environment / SH lighting

特にDirectional Lightのリアルタイム影では、Shadow attenuationによってToon用light directionの重みが変化しないこと。

リアルタイム影は SCShadingData.shadow などの独立した値として保持し、後続のToon Shade判定で使用する構造を基本とする。

設計事項

実装前に次を確定する。

  • Shader-Core共通BIRP lightingを変更せずPure Base側だけで分離できるか。
  • 必要な場合、モデル側callback / host-owned custom dataをどのように拡張するか。
  • Directional LightのShadow visibilityとPoint / Spotの距離・角度attenuationをどう区別するか。
  • ForwardAddのPoint / Spot Lightで距離attenuationを維持しながらShadow visibilityだけをShade判定へ分離できるか。
  • Mixed Lighting / Shadowmask / Subtractive / Lightmap環境で既存のUnity attenuation契約を壊さない方法。
  • リアルタイムShadowを1st / 2nd / 3rd Shadeへどのように適用するかは Toon本体に3段階の影設定とパック済みShade Mask / AOを追加する #59 の多段影仕様と整合させる。
  • ShadowCaster Passは「影を落とす」責務のままとし、このIssueの「影を受ける」処理と分離する。

実装要件

  • Directional LightのリアルタイムShadowでToonの集約ライト方向が変化しない。
  • Shadow attenuationを理由にToonのdirect light colorそのものを0へ潰さない。
  • リアルタイム影をToon Shade側で利用できる独立値として公開する。
  • 影なし設定では既存のDirect + SH Toon lighting結果を維持する。
  • PBR / Hybrid / Unlitの既存ライティング所有権を変更しない。
  • ForwardAddの距離attenuationやSpot attenuationを意図せず失わない。
  • 不要なshader variantを増やさない。

完了条件

  • Directional Light + Soft ShadowでShadowMap境界がToonのlight directionへ漏れない。
  • Directional LightのShadow attenuationがToon direct colorを直接黒へ潰さない。
  • リアルタイム影を独立したshadow / visibility値としてShade判定へ渡せる。
  • Light shadowsをNoneにした場合と、影を受けない領域で既存Toon結果が一致する。
  • Point / Spot / ForwardAddの距離attenuation契約が維持される。
  • Mixed Lighting / Lightmapとの責務境界が文書化される。
  • PBR / Hybrid / Unlitへ描画回帰がない。
  • Soft / Hard / NoneのリアルタイムShadow回帰テストが追加される。
  • Toon本体に3段階の影設定とパック済みShade Mask / AOを追加する #59 の多段Shadeがこの独立shadow値を利用できる契約になる。

関連

Metadata

Metadata

Assignees

Labels

enhancementNew feature or request

Type

No type

Projects

No projects

Relationships

None yet

Development

No branches or pull requests

Issue actions