threejs-ambient-contact-shading について
Three.js でアンビエントコンタクトシェーディングを実装する開発者向けスキルです。マテリアル AO、スクリーンスペース GTAO、AO の省略を選ぶ際の指針と、照明、履歴、リソース、検証要件を示します。
主な機能
- 01要件に応じた AO 方式の選択
- 02深度・法線・透明度入力の定義
- 03スカラー可視度を間接光に適用
- 04有効な履歴がある場合のみ時間フィルタを使用
- 05スカラー AO の合格後にベント法線を追加
- 06描画・リソース・ライフサイクルの検証
活用シーン
- 01Three.js シーンの AO 方式選定
- 02既存のレンダーパイプラインへの GTAO 統合
- 03動作中の時間 AO の挙動確認
- 04AO 出力とリソース解放のテスト
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ linegel/ threejs-complete-set-of-skill --skill threejs-ambient-contact-shadingインストール後、Claude Code で/threejs-ambient-contact-shadingを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
LICENSEagents/openai.yamlreferences/gtao-bent-normal-pipeline.md詳細
環境遮蔽
AO は間接照明の可視性を表します。間接拡散反射や環境光・鏡面反射の応答を減衰させることがあります。AO を直接光、発光、UI、またはすでにトーンマッピングされたフレームに乗算しないでください。最終画像は間接照明によって変化します。直接光や発光が不変であることは、最終 RGB が変わらないことを求めるのではなく、固定露出でシーンリニアの項目ごとに分けてテストしてください。
$threejs-choose-skills は任意で使用できる複数システムの調整役です。AO が深度、法線、速度、履歴、または最終出力の所有権を共有する場合は、$threejs-image-pipeline を使用してください。
1. 環境可視性の分岐を選択する
ゲートを通過する最初の分岐を使用してください。
| ゲート | 分岐 | 結果 |
|---|---|---|
| 必要な遮蔽が静的または局所的で、アセットに作成できる | マテリアルの aoMap / aoNode | 前方レンダリングは 1 回です。動的なオブジェクト間接触はありません。 |
| 動的な画面空間の接触が必要で、レンダラーが間接照明を個別に公開する | その項目に GTAO の可視性を適用する | 1 回のジオメトリパスで済む可能性があります。 |
標準の前方 NodeMaterial で動的な接触が必要で、完全な追加コストが許容範囲内 | 深度/法線パス -> GTAO -> 任意の再構成 -> builtinAOContext() を使った 2 回目のライティングパス | 正しい配置にはシーンの走査が 2 回必要です。 |
| それ以前の分岐が品質とコストのゲートを満たさない | 画面空間 AO を省略する | マテリアル、直接光のシャドウ、シルエットの見やすさを維持します。 |
r185 の GTAONode には、AO が存在する前に現在の深度/法線が必要です。一方、builtinAOContext() はマテリアルのライティング中に存在していなければなりません。パリティが実証された深度/法線専用パスで置き換えない限り、最初のパスはマテリアル、変形、アルファテストを含む完全なシーンパスとして扱ってください。
完了条件: 選択した分岐で間接照明の所有者を明示し、追加されるすべてのパス/アタッチメントのコストを計上するか、画面空間 AO を省略したことを記録します。
2. 入力コントラクトを確定する
- レンダラーを初期化し、グラフ作成前に WebGPU バックエンドを必須とします。r185 のデフォルトグラフは、透視投影の非対数標準深度を必要とします。正投影、対数深度、逆深度、サブビューポートの各アダプターでは、深度/法線の再構成、ビュー方向、空、順序の各ルールをすべて実証してください。
- 不透明な遮蔽物、不透明な受け面、アルファカバレッジ、および透明のポリシーを 1 つ定義します。ポリシーは、画面空間 AO を使わない、作成済みのマテリアル AO を使う、または検証済みのカスタムライティングモデルのいずれかです。標準の
builtinAOContext()は透明マテリアルをスキップします。 - AO を、アクティブなビューの
screenUV、描画バッファの寸法、投影にバインドします。独立したビューごとに個別の状態を持つノードを使用してください。幅と高さはそれぞれ独立して扱い、正の値に丸めたターゲット寸法を許可し、サイズが 0 のビューでは無効な AO を公開せずに処理を一時停止します。 - エッジ用フィクスチャと対象環境でのタイミングテストに合格した場合に限り、縮小した生 AO に深度再構成法線を選択します。共有される場合、再構成結果を実体化する場合、滑らかなジオメトリや薄いジオメトリで問題が発生する場合、または測定されたアタッチメントの追加コストがより低い場合は、MRT 法線を選択します。
- 物理的な接触半径はワールド単位で表します。
radiusRender = radiusMeters * renderUnitsPerMeter。寸法を持つ厚みとバイアスにも同じ換算を適用します。作成済みの見た目を使う分岐では、シーン単位のみのコントロールであることを宣言し、アセット/ワールドのスケーリング後に再検証します。
別のシステムからスケール、動き、またはリソースが提供される場合、それらの入力を使う前に、単位、座標系、現在/過去の表示時刻、権限、バージョン、リソースの世代、有効性、リセット条件をバインドしてください。
完了条件: 深度規約、画面座標、法線のソース、透明度、スケールの意味、すべての外部プロデューサーが明示され、次元的に互換性があります。
3. スカラー可視性を実体化する
選択したスクリーンスペースの分岐を、次の順序で構築します。
shared-or-AO-owned depth + optional normal/velocity
-> GTAO scalar visibility
-> optional materialized edge-aware reconstruction
-> indirect-light application
-> optional temporal resolve over the matching admitted layers
-> excluded-layer composition only when those layers were separated
-> one tone-map/output-transform owner
- 共有シーンパスを再利用し、AO 用に 2 つ目の G-buffer を作成しないでください。
- 解像度を下げた生の AO には通常のテクスチャーフィルタリングを適用し、バイラテラル再構成は適用しません。エッジに問題が生じた場合は、検証済みの再構成を一度実体化してから、
screenUVでサンプリングします。インストールされたデノイザーには、リファレンスにあるインデックス/回転の補正が必要です。標準の構築だけでは採用条件を満たしません。生の AO/フル解像度 AO を使う方法や、省略する方法も選択肢です。 - メッシュのマテリアルグラフ内では、生の可視性と再構成後の可視性を両方とも
screenUVで明示的にサンプリングします。暗黙のテクスチャー座標はメッシュ UV として解決されます。 - 標準の透過/透過光レンダリングは、非時間的なライティングパスに保持します。
builtinAOContext()はすでに透過マテリアルをスキップします。時間的な解決や、すでに所有する外部コンポジターがある場合に限り、不透明オブジェクト専用のライティングパスと別個のレイヤー合成を使用します。その全コストを考慮し、コンポジターを共有する場合は AO に増分コストのみを計上します。 - スカラー可視性は単一チャンネルのままにします。AO を無効にするときは出力グラフを置き換え、
RenderPipelineを dirty としてマークして、非アクティブな処理に到達できないようにします。所有するノイズ、再構成ターゲット、マテリアルのすべてのハンドルを保持します。ベースノードの破棄は再帰的ではなく、標準 AO の破棄後もノイズは残ります。
GTAO を実装する場合や再構成方法を選択する場合は、 r185 GTAO パイプライン と再構成のトレードオフ を確認してください。
完了条件: アクティブなグラフで深度/法線の所有者が 1 つだけであり、可視性がスクリーンスペースでサンプリングされ、AO が間接照明にのみ適用され、AO をオフにするとすべての AO パスと依存関係がなくなること。
4. 有効な履歴がある場合に限り時間フィルタリングを採用する
GTAONode.useTemporalFiltering はサンプルを回転させますが、履歴を作成したり再投影したりはしません。稼働中の TRAA/カスタム解決、有効なカメラおよびオブジェクトのモーション(変形/インスタンシング/アルファカバレッジを含む)、一致するビューティー/深度/速度の各次元とレイヤーメンバーシップ、棄却処理、リセット動作が揃っている場合に限り有効にします。深度と速度の各信号に含まれるレイヤーのみを解決します。除外された透過レイヤーや屈折レイヤーは、その後に合成します。一致する深度、モーション、カバレッジ、棄却動作が検証された場合に限り、それらを解決処理に含めてください。
カメラ/投影のカット、補正されないリベース、ジオメトリやカバレッジの不連続、AO パラメーター/スケール/解像度の変更、品質の移行時にはリセットまたは再シードします。r185 TRAANode には公開されているカメラカット用リセット機能がありません。ノードを再構築して破棄し、出力グラフを置き換えて、パイプラインを dirty としてマークしてください。
時間的 AO を選択する場合は、履歴を構築する前に 時間的処理の契約 を確認してください。
完了条件: ビューティー、深度、速度が同じ対象レイヤーをカバーし、除外された透過/屈折レイヤーがあれば解決後に合成されること。また、移動する遮蔽物、非オクルージョン領域、カメラカット、リサイズ、AO パラメーター変更の各テスト用フィクスチャが、明示的な棄却/リセットを伴って合格するか、時間的 AO が無効になっていること。
5. スカラー AO の合格後にのみベント法線を追加する
ベント法線は、可視性で重み付けされた、遮蔽されていない方向の平均です。この分岐を追加するのは、スカラー AO がすでに合格しており、方向性のある環境応答が目視できて必要であり、かつ片側壁のフィクスチャによって、その方向が遮蔽された半球と反対を向くことが検証された場合に限ります。
ベント法線を選択する場合は、基底、フィルタリング、正規化、格納方法、符号の検証について、 ベント法線の契約 を確認してください。
完了条件: スカラー可視性を独立して利用でき、方向が正確に 1 回だけ変換され、片側壁のフィクスチャに合格すること。それ以外の場合、方向性の利用は無効のままにします。
6. 完成したグラフを検証する
アクティブなスクリーンスペース分岐では、深度の生データ、選択した法線入力、許可されている場合は生/再構成AO、間接寄与、直接光/発光の残差、時間フィルタリングがある場合は速度/履歴の棄却、およびAOオフをキャプチャします。UV不変性、薄いシルエット、透明オブジェクトの交差、滑らかな曲線、画面端、非対称な投影、存在する場合はモーション、リサイズ、破棄/再作成をテストします。
作成者定義のマテリアルAOでは、代わりに作成者定義のUVセット、アセット/ワールドのスケーリング、間接光のみへの配置を検証します。スクリーンAOを省略する場合は、スクリーンAOのパス、アタッチメント、履歴、依存関係のいずれにも到達できないことを記録します。
完了条件: 直接光と発光が不変であること、選択した分岐のすべてのフィクスチャが合格すること、アクティブなスクリーンスペース分岐に意図しないUV追従、エッジをまたぐハロー、ちらつき、残像がないこと、AOオフまたは省略時にスクリーンAOの処理がゼロであること、対象デバイスでの追加処理時間とリソース使用量が基準を満たすこと、再作成後にリソースカウンターが基準値に戻ること。
所有範囲
このスキルは、スカラーGTAO、再構成方法の選択、間接光の配置、時間フィルタリングの適用可否、ベント法線、AO診断を担当します。画像パイプラインの担当者は、共有MRT、グローバルなパス順序、履歴インフラストラクチャ、トーンマッピング、出力変換、適応型解像度を担当します。