mcpField
T
threejs-exposure-color-grading

threejs-exposure-color-grading

github.com/linegel開発11136 回インストール5 週間前に更新
リポジトリ

threejs-exposure-color-grading について

Three.js の露出とカラーグレーディングの設計・検証に使うスキルです。測光、適応、トーンマッピング、出力変換の所有者を明確にし、分岐ごとの検証を行います。

主な機能

  1. 01シーンリニアなカラー処理
  2. 02固定露出と自動露出
  3. 03GPU 常駐の適応状態
  4. 04トーンマッピングと LUT 配置
  5. 05リセットと不連続への対応
  6. 06分岐別の検証フィクスチャ

活用シーン

  1. 01キャリブレーション済みビューの露出設定
  2. 02自動露出測光の構築
  3. 03Three.js の描画チェーンへの LUT 追加
  4. 04出力変換の所有権確認

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/linegel/threejs-complete-set-of-skill --skill threejs-exposure-color-grading

インストール後、Claude Code で/threejs-exposure-color-gradingを入力して読み込まれたか確認します。

同梱ファイル

SKILL.md と一緒にインストールされる参考資料やスクリプト。

LICENSE
agents/
openai.yaml
examples/
identity-3d-lut.mjs
references/
scene-referred-color-pipeline.md

詳細

露出とカラーグレーディング

撮影信号は、最終的な画像処理チェーンまでシーンリニアのまま維持します。各露出グループ、トーンマップ、出力変換の制御は、それぞれ宣言した単一の所有者が担います。

1. カラー契約を確定する

シーンリニアの作業用原色、放射輝度スケール、アルファ規約、および撮影信号に入力されるすべての生成元を明記します。放射輝度を測定する前に、マテリアル/ライティングモデルを通して放射照度を変換します。ライト、環境、空気、発光マテリアル、ブルームソース、光学効果には、共通の物理的または知覚的な放射輝度スケールを1つ適用します。

ターゲットまたはビューを露出制御グループに分けます。放射輝度の基準、露出ポリシー、リセット履歴が同一の場合に限り、グループ間でGPU状態を共有できます。自動グループではさらに、測光マスク、キー、サンプルスケジュール、および明示的なソース/統合アグリゲートも同一である必要があります。設定が一致する独立した画像を、測光入力として相互に置き換えることはできません。各グループには、露出、トーンマップ、出力変換の所有者をそれぞれ正確に1つ割り当てます。

完了条件: 撮影対象となるすべての入力に基準とスケールが1つずつ定められ、各グループにメンバー、露出/トーンマップ/出力変換の所有者、および状態共有ポリシーが明記されていること。

2. 画像要件を満たす最も低コストの測光方式を選ぶ

依存関係の順に選択します。

  1. 制御されたビューまたはキャリブレーション済みビューには、固定EVを使用します。
  2. 一般的なグローバル自動露出には、層化グリッドまたはタイルサンプラーを使用します。
  3. すべてのピクセルまたは正確なマスクを確実に反映する必要がある場合は、正確な全ピクセル階層リダクションを使用します。
  4. 他の機能がそのレベルまたは空間統計を利用する場合に限り、対数輝度ピラミッドを使用します。
  5. パーセンタイルクリッピングによって、実証された外れ値または二峰性照明の問題を解決できる場合に限り、ヒストグラムを使用します。

デフォルトでは、ブルーム適用前の解決済みHDRをサンプリングします。これにより、時間的ノイズが測光に混入せず、ブルームと露出のフィードバックも回避できます。異なるサンプリング位置を使う場合は、回帰テスト用フィクスチャを用意する画像ポリシーとして明示します。

サンプル測光、正確な測光、ピラミッド測光、またはヒストグラム測光を実装する場合は、カラー処理パイプラインのリファレンスを参照してください。重み付き対数の式、トラフィックモデル、小さな発光体の失敗テストが記載されています。

完了条件: 固定EVの場合は値/キャリブレーションが明記され、測光ソースの読み取りがゼロであること。それ以外の場合は、測光方式を1つ選択してそのソースとマスクを明記し、より低コストの各選択肢を退ける具体的な正確性上の問題が示されていること。

3. 選択した露出コントローラーを構築する

固定EVの場合は、作成済みまたはキャリブレーション済みの値を直接バインドし、測光、リダクション、ターゲット公開、または適応の状態を割り当てません。

自動露出の場合は、targetEV、currentEV、有効性、フレームインデックスをGPU状態に保持します。測光の実行頻度にかかわらず、レンダリングされた各フレームで、最後に有効だったターゲットに向けて適応を進めます。CPUへの読み戻しは診断専用にします。

このプロデューサースケジュールは、自動露出の場合にのみ使用します。

adapt currentEV from the last completed target
  -> render and present with currentEV
  -> reduce the new meter source
  -> publish targetEV for a later frame

ソーステクスチャを実際のノード依存関係としてバインドし、ソースフレームと状態フレームの両方を公開します。最初のリダクションより前にソースを初期化またはクリアします。リダクション状態、EV適応、無効なアグリゲート、r185のコンピュートセマンティクスについては、GPU露出状態を参照してください。

完了条件: 固定EVの場合は測光/適応処理がゼロであること。または、自動露出のフレームトレースにより、各ターゲットを生成したソースが示され、適応がGPU上に保持され、無効なアグリゲートがCPUによる代替なしで直前の有効なターゲットを維持することが確認できること。

4. 表示前に不連続性を処理する

カットには、作成者が指定した hold、reseed、または固定EVポリシーを設定します。放射輝度基底、作業プライマリ、量、非線形正規化、露出キーの変更は、新しい露出エポックとして扱います。それ以外のセマンティクスが同一で、正のスケールだけが変わる場合は、 L_new = k * L_old、 表示される積を維持するため、固定EVまたは両方の自動状態を -log2(k) だけシフトします。

currentEV_new = currentEV_old - log2(k)
targetEV_new  = targetEV_old  - log2(k)

正規化に依存するEVの上下限も変換するか、クランプによって維持できなくなることを明示します。これは通常のライティング変更に使う近道ではありません。置き換えられたエポックからの公開キューは、変換後の状態を上書きする前に破棄します。

それ以外の互換性のない変更では、必ず新しい露出エポックを開始します。自動露出ではメーターの蓄積をリセットし、適応状態を再シードします。固定露出では、新しい信号を提示する前に、作成者が指定した値を再バインドします。サイズ変更やDPRの変更では、許可された解像度依存のメーターリソースとサンプリング座標のみを再構築します。デバイスロスト時は、新しいリソース世代のもとで、許可されたGPU状態のみを再作成して再シードします。

完了条件: すべてのカット、無効な入力、基底/スケールの変更、サイズ変更、デバイスロストイベントが、影響を受けるフレームが許可される前に完了する変換、保持、再構築、または再シードのいずれかに対応するか、選択した分岐が影響を受ける状態を所有していないため明示的に何もしないこと。

5. 最終画像の処理チェーンをひとつにまとめる

LUTで別の完全なコントラクトが宣言されていない限り、次の順序を使用します。

scene-linear HDR
  -> exposure
  -> tone map
  -> tone-mapped-linear LUT, when admitted
  -> alpha restoration
  -> output conversion

非線形RGB演算の前にアンプリマルチプライし、その後にプリマルチプライします。露出はアルファを保持します。シーンリニアLUTには、宣言済みのシェーパーが必要です。ディスプレイエンコードLUTは出力の正確なプライマリと伝達関数を所有するため、renderOutput() の後に配置します。

明示的な renderOutput() を使用する場合は、 RenderPipeline.outputColorTransform = false を設定します。出力ノードまたは出力の所有権を変更した後は、 renderPipeline.needsUpdate = true を設定します。キューブの読み込み、作成、配置を行う場合にのみ、トーンマッピングとLUTを参照してください。

トーンマップ後リニアのキューブを許可する場合は、ボクセルの順序と Data3DTexture の設定について、恒等3D-LUTの例を参照してください。デバイスのエッジ上限とバイト予算を指定します。ヘルパーは割り当て前に両方をチェックします。RGBA8恒等LUTには、宣言済みの量子化許容誤差があります。これは正しさを確認するためのテスト用フィクスチャであり、ルックやパフォーマンスを回避する手段ではありません。

完了条件: グラフに含まれるのは、露出乗算1回、トーンマッピング1回、作業色空間から出力色空間への変換1回、および許可された場合に限り、宣言済みドメインへのLUT配置1回です。

6. 選択した分岐を検証する

次の決定論的なフィクスチャをキャプチャします。

  • 固定露出の場合:作成者が指定したEVと乗数を示し、メーターのソース読み取りや適応状態がゼロであることを証明するキャリブレーションカード。
  • 自動露出の場合:期待される目標EVを示すキーグレーカード、および明るい光源がフレーム内に入るときとフレーム外に出るときの、目標EVと現在EVの単調な軌跡。
  • サンプリング式自動メーターの場合:マスク、小型発光体、更新頻度の各ケース。
  • ヒストグラムの場合:アンダーフロー、オーバーフロー、採用するパーセンタイル区間。
  • LUTを許可する場合:宣言済みドメインにおけるランプと彩度の高いスウォッチを含む恒等LUT。
  • 出力の分離:トーンマッピングと出力変換がそれぞれ正確に1回であること。

許可した各メーターまたはLUTについて、対象環境でウォームアップ後にグラフの差分をペアで測定します。GPU時間を利用できるのは、初期化後のタイムスタンプクエリのサポートが証明された場合のみです。それ以外の場合は、計測時間を利用できないと報告します。

完了条件: 該当するすべてのフィクスチャに合格し、最終画像を確認し、各フィクスチャの失敗原因をメーター、適応、LUTドメイン、アルファ、または出力の所有権のいずれかとして特定できていること。

ルーティング

共有MRT、時間的履歴、適応DPR、一時的なライフタイムには $threejs-image-pipeline を使用します。グレアのソース所有権には $threejs-bloom を使用し、固定ビューの画像による証拠には $threejs-visual-validation を使用します。

コメント