目的
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のライティング経路を変更しない。
完了条件
関連
目的
PureBase/Toonに移植した最小SHライティングを、lilToon 2.3.4がBIRPで利用するOpenLit 1.0.2の支配ライト方向・SH明暗帯の計算へより忠実に合わせる。現在のPure Base実装はOpenLitの概念を参考にしているが、
ShadeSH9ToonDouble相当の明部・暗部計算が簡略化されており、ライトを下から当てた場合や環境光が強い場合にlilToonと異なる明暗分布になる。現状の差分
Pure Baseでは現在、概念的に次のような2帯SHを生成している。
一方、OpenLit 1.0.2の
ShadeSH9ToonDoubleは次の点が異なる。V = GetV(lightDirection, positionWS)を使用する。shMaxはその方向でL0/L2 + L1を評価する。shMinは単純にL1を反転せず、normalize(olSHAr.rgb + olSHAg.rgb + olSHAb.rgb)からSH自身の支配方向を作り、その方向でL1を再評価する。ComputeLightDirectionはmain light colorの輝度、SH一次項、fallback / override方向を合成して正規化する。対象
Shaders/Common/toon_lighting.hlslShaders/Models/toon.hlslShaders/Common/birp_host.hlsl実装方針
OpenLit 1.0.2の以下の概念を、Pure BaseのShader-Coreホスト契約を壊さない範囲で忠実に再現する。
ComputeLightDirectionShadeSH9ToonDoubleComputeSHLightsAndDirectionComputeLightsただしOpenLitコードの単純コピーではなく、Pure Base側の既存データ構造と責務へ合わせて最小実装する。
設計事項
実装前に次を確定する。
GetV(lightDirection, positionWS)の通常BIRP時の意味をPure Baseでどう表現するか。ComputeLightsの境界。実装要件
ShadeSH9ToonDouble相当に合わせる。base - linearTermによるdark band生成を廃止する。完了条件
関連