Skip to content

ToonのSHライティングをOpenLitの計算へ忠実に合わせる #61

Description

@PenguinDOOM

目的

PureBase/Toon に移植した最小SHライティングを、lilToon 2.3.4がBIRPで利用するOpenLit 1.0.2の支配ライト方向・SH明暗帯の計算へより忠実に合わせる。

現在のPure Base実装はOpenLitの概念を参考にしているが、ShadeSH9ToonDouble 相当の明部・暗部計算が簡略化されており、ライトを下から当てた場合や環境光が強い場合にlilToonと異なる明暗分布になる。

現状の差分

Pure Baseでは現在、概念的に次のような2帯SHを生成している。

float3 E = L * 0.666666;
...
float3 bright = max(base + linearTerm, 0);
float3 dark = max(base - linearTerm, 0);
return lerp(dark, bright, step(0, dot(surfaceNormal, L)));

一方、OpenLit 1.0.2の ShadeSH9ToonDouble は次の点が異なる。

  • SH評価方向として V = GetV(lightDirection, positionWS) を使用する。
  • 明部 shMax はその方向でL0/L2 + L1を評価する。
  • 暗部 shMin は単純にL1を反転せず、normalize(olSHAr.rgb + olSHAg.rgb + olSHAb.rgb) からSH自身の支配方向を作り、その方向でL1を再評価する。
  • Gamma color spaceではSH結果をsRGB側へ補正する。
  • ComputeLightDirection はmain light colorの輝度、SH一次項、fallback / override方向を合成して正規化する。

対象

  • Shaders/Common/toon_lighting.hlsl
  • Shaders/Models/toon.hlsl
  • 必要に応じて Shaders/Common/birp_host.hlsl
  • Toon lighting contract tests
  • 技術ドキュメントとNOTICE上の由来説明

実装方針

OpenLit 1.0.2の以下の概念を、Pure BaseのShader-Coreホスト契約を壊さない範囲で忠実に再現する。

  • ComputeLightDirection
  • ShadeSH9ToonDouble
  • ComputeSHLightsAndDirection
  • ComputeLights

ただしOpenLitコードの単純コピーではなく、Pure Base側の既存データ構造と責務へ合わせて最小実装する。

設計事項

実装前に次を確定する。

  • OpenLitの GetV(lightDirection, positionWS) の通常BIRP時の意味をPure Baseでどう表現するか。
  • Light Direction Overrideは Toon本体に3段階の影設定とパック済みShade Mask / AOを追加する #59 とは別の将来機能として残し、このIssueではfallback方向のみ再現するか。
  • Gamma / Linear color spaceでOpenLitと同じSH色変換を行うか。
  • Lightmap有効時にSH方向・SH帯をどこまで無効化するか。
  • Shader-Coreが提供するlightmap / additional-light契約とOpenLitのComputeLightsの境界。
  • ForwardAddではSH環境光を加えない既存契約を維持すること。
  • #60でShadow attenuationを分離した後も、Shadow visibilityがSH方向計算へ混入しないこと。

実装要件

  • 支配ライト方向の式をOpenLit 1.0.2のBIRP挙動と比較可能な形にする。
  • SH bright / dark bandの計算をOpenLitの ShadeSH9ToonDouble 相当に合わせる。
  • 単純な base - linearTerm によるdark band生成を廃止する。
  • Gamma / Linear差を意図的に扱い、採用仕様をテストする。
  • Lightmap時に焼き込み光を二重加算しない。
  • ForwardAddは追加直接光のみのままとする。
  • PBR / Hybrid / Unlitのライティング経路を変更しない。

完了条件

  • OpenLit 1.0.2と同じ入力条件で支配ライト方向が十分に一致する。
  • SH bright bandがOpenLit相当の式で評価される。
  • SH dark bandがSH自身の支配方向を使うOpenLit相当の式で評価される。
  • ライトを上・横・下から当てた代表ケースでlilToonとの明暗分布差が説明可能な範囲まで縮小する。
  • Ambient Source / SH色を変えた場合の回帰テストを追加する。
  • Gamma / Linear color spaceの仕様が明確になっている。
  • Lightmap / ForwardAddの既存所有権を維持する。
  • #60のShadow visibilityがSH方向・SH帯へ混入しない。
  • OpenLit 1.0.2 CC0由来の概念であることをコードコメント / NOTICE / 技術文書で維持する。

関連

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