mcpField
T
threejs-impl-post-processing

threejs-impl-post-processing

github.com/impertio-studio開発23143 回インストール30 週間前に更新
リポジトリ

threejs-impl-post-processing について

Three.js 組み込み、pmndrs、WebGPU の各システムでポストプロセスを実装するためのリファレンスです。エフェクトの構成、パス順序、設定、リサイズを扱います。

主な機能

  1. 013 種類のポストプロセス方式の比較
  2. 02EffectComposer パイプラインの設定
  3. 03ブルーム、遮蔽、輪郭、被写界深度の効果
  4. 04アンチエイリアスとカスタムシェーダーパス
  5. 05リサイズ処理とシステム間の互換性

活用シーン

  1. 01WebGL シーンへのブルーム追加
  2. 02選択オブジェクトの輪郭設定
  3. 03アンチエイリアスと色出力の設定
  4. 04R3F 向けポストプロセス方式の選択

インストール

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

$npx skills add https://github.com/impertio-studio/three.js-claude-skill-package --skill threejs-impl-post-processing

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

同梱ファイル

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

.gitkeep
references/
anti-patterns.md
examples.md
methods.md

詳細

threejs-impl-post-processing

クイックリファレンス

アーキテクチャの概要

Three.js には、互換性のないポストプロセッシングシステムが2種類あります。絶対に混在させないでください。

システムパッケージ方式最適な用途
組み込みの EffectComposerthree/addons/postprocessing/エフェクトごとに1つのシェーダーパスシンプルな構成、カスタムの ShaderPass
pmndrs/postprocessingpostprocessing (npm)エフェクトを1つのパスに統合パフォーマンスが重要な場合、R3F アプリ
WebGPU PostProcessingthree/addons/tsl/display/ノードベースの TSL グラフWebGPU レンダラーのみ
標準パイプライン(組み込みの EffectComposer)
import { EffectComposer } from 'three/addons/postprocessing/EffectComposer.js';
import { RenderPass } from 'three/addons/postprocessing/RenderPass.js';
import { OutputPass } from 'three/addons/postprocessing/OutputPass.js';

const composer = new EffectComposer( renderer );
composer.addPass( new RenderPass( scene, camera ) ); // ALWAYS first
// ... effect passes here ...
composer.addPass( new OutputPass() );                 // ALWAYS last

function animate() {
  composer.render(); // replaces renderer.render( scene, camera )
}
パスの順序に関するルール
  1. RenderPass は必ず最初のパスにします。シーンを内部バッファーにレンダリングします
  2. エフェクトパスは中央に、任意の順序で配置します(ブルーム、SSAO、アウトラインなど)
  3. アンチエイリアスパス(SMAA、FXAA)はエフェクトパスの後に配置します
  4. OutputPass は必ず最後のパスにします。トーンマッピングと色空間変換を適用します
  5. OutputPass を省略しないでください。省略すると、色が白っぽく見えたり、正しく表示されなかったりします
重要な警告

three/addons/postprocessing/EffectComposer と、pmndrs/postprocessing の EffectComposer を絶対に混在させないでください。互換性のないバッファー形式を使用しているため、描画アーティファクトやクラッシュが発生します。

ウィンドウのリサイズ時に composer.setSize() を呼び出し忘れないでください。コンポーザーをリサイズしないと、エフェクトがぼやけたり、位置がずれたりします。

EffectComposer の使用中は renderer.render( scene, camera ) を呼び出さないでください。代わりに必ず composer.render() を呼び出してください。両方を呼び出すと、シーンが2回レンダリングされます。

WebGPU レンダラーでは WebGL のポストプロセッシングパスを使用しないでください。WebGPU では、ノードベースの別個の PostProcessing クラスを使用します。

必ず RenderPass を最初のパスに含めてください。含めないと、後続のパスに空のバッファーが渡されます。


EffectComposer API

コンストラクター
new EffectComposer( renderer: WebGLRenderer, renderTarget?: WebGLRenderTarget )
  • renderer -- WebGLRenderer インスタンスです
  • renderTarget -- 任意のカスタムレンダーターゲットです。省略すると自動的に作成されます
プロパティ
プロパティ型説明
.passesPass[]順序付きのポストプロセッシングパス配列
.readBufferWebGLRenderTarget内部読み取りバッファー
.writeBufferWebGLRenderTarget内部書き込みバッファー
.renderToScreenboolean最終パスを画面にレンダリングするかどうか(デフォルトは true)
.rendererWebGLRendererレンダラーインスタンス
メソッド
メソッド説明
.addPass( pass )パスをチェーンの末尾に追加します
.insertPass( pass, index )指定した位置にパスを挿入します
.removePass( pass )チェーンからパスを削除します
.render( deltaTime? )有効なすべてのパスを順番に実行します
.setSize( width, height )すべての内部バッファーとパスのサイズを変更します
.setPixelRatio( ratio )デバイスのピクセル比を設定します
.swapBuffers()読み取りバッファーと書き込みバッファーを入れ替えます
.reset( renderTarget? )内部状態を復元します
.dispose()すべての GPU リソースを解放します

利用可能なパスタイプ

コアパス(必ず必要)
パスインポート用途
RenderPasspostprocessing/RenderPass.jsシーンをバッファーにレンダリングします。必ず最初に配置します
OutputPasspostprocessing/OutputPass.jsトーンマッピングと色空間処理を行います。必ず最後に配置します
エフェクトパス
パスコンストラクター用途
UnrealBloomPass( resolution, strength?, radius?, threshold? )HDR ブルームの発光
SSAOPass( scene, camera, width?, height? )スクリーンスペースアンビエントオクルージョン
GTAOPass( scene, camera, width?, height? )グラウンドトゥルース AO(高品質)
SAOPass( scene, camera )スケーラブルアンビエントオブスキュランス
OutlinePass( resolution, scene, camera, selectedObjects? )オブジェクト選択の輪郭
BokehPass( scene, camera, params )被写界深度
SSRPass( params )スクリーンスペース反射
FilmPass( intensity?, grayscale? )フィルムグレイン/走査線
GlitchPass( dtSize? )デジタルグリッチエフェクト
HalftonePass( width, height, params )ハーフトーンのドットパターン
DotScreenPass( center?, angle?, scale? )ドットスクリーンオーバーレイ
AfterimagePass( damp? )モーショントレイル/残像
LUTPass( params )カラー LUT グレーディング
RenderPixelatedPass( pixelSize, scene, camera )ピクセル化エフェクト
アンチエイリアスパス
パスコンストラクター品質コスト
FXAAPass()低 -- 高速な近似最も低い
SMAAPass( width, height )中 -- サブピクセル形態学的処理中程度
SSAARenderPass( scene, camera )高 -- スーパーサンプリング高い
TAARenderPass( scene, camera )高 -- 時間方向の蓄積高い
ユーティリティパス
パス用途
ShaderPassカスタム GLSL シェーダーエフェクト
MaskPassステンシルマスキング
ClearMaskPassステンシルマスクをクリア
ClearPassバッファーをクリア
TexturePassテクスチャをレンダリング
CubeTexturePassキューブマップ背景をレンダリング
SavePass現在のバッファーをレンダーターゲットに保存
RenderTransitionPass2 つのシーン間のアニメーション付きトランジション

すべてのパスは three/addons/postprocessing/{PassName}.js からインポートします。


主なエフェクトの設定

UnrealBloomPass
import { UnrealBloomPass } from 'three/addons/postprocessing/UnrealBloomPass.js';

const bloom = new UnrealBloomPass(
  new THREE.Vector2( window.innerWidth, window.innerHeight ),
  1.5,  // strength -- bloom intensity [0, 3+]
  0.4,  // radius -- bloom spread [0, 1]
  0.85  // threshold -- luminance cutoff [0, 1]
);

ブルームを正しく機能させるには、レンダラーでトーンマッピングを必ず有効にしてください。オブジェクトごとの選択的なブルームは標準ではサポートされていません。回避策として、複数のレンダーパスと layers システムを使用してください。

SSAOPass / GTAOPass

本番品質では、必ず SSAOPass より GTAOPass を優先してください。SSAOPass はプロトタイピングでのみ使用してください。

// SSAOPass (faster, lower quality)
const ssao = new SSAOPass( scene, camera, width, height );
ssao.kernelRadius = 8;
ssao.minDistance = 0.005;
ssao.maxDistance = 0.1;

// GTAOPass (slower, production quality)
const gtao = new GTAOPass( scene, camera, width, height );
OutlinePass
const outline = new OutlinePass(
  new THREE.Vector2( window.innerWidth, window.innerHeight ),
  scene, camera
);
outline.selectedObjects = [ mesh1, mesh2 ];
outline.edgeStrength = 3;
outline.edgeGlow = 0;
outline.edgeThickness = 1;
outline.visibleEdgeColor.set( 0xffffff );
outline.hiddenEdgeColor.set( 0x190a05 );

カスタム ShaderPass

import { ShaderPass } from 'three/addons/postprocessing/ShaderPass.js';

const myShader = {
  uniforms: {
    tDiffuse: { value: null }, // ALWAYS include -- receives read buffer
    amount: { value: 0.5 }
  },
  vertexShader: `
    varying vec2 vUv;
    void main() {
      vUv = uv;
      gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );
    }
  `,
  fragmentShader: `
    uniform sampler2D tDiffuse;
    uniform float amount;
    varying vec2 vUv;
    void main() {
      vec4 color = texture2D( tDiffuse, vUv );
      gl_FragColor = mix( color, vec4( 1.0 - color.rgb, color.a ), amount );
    }
  `
};

const customPass = new ShaderPass( myShader );
composer.insertPass( customPass, 1 ); // after RenderPass

textureID パラメーターのデフォルト値は 'tDiffuse' です。シェーダーが入力テクスチャに別のユニフォーム名を使用する場合は、2 番目の引数として渡してください。new ShaderPass( myShader, 'myInputTexture' )


pmndrs/postprocessing

アーキテクチャ

pmndrs/postprocessing ライブラリは複数のエフェクトを単一のシェーダーパスに統合し、組み込みシステムと比べてドローコールを大幅に削減します。

import { EffectComposer, EffectPass, RenderPass, BloomEffect,
         SMAAEffect } from 'postprocessing';

const composer = new EffectComposer( renderer );
composer.addPass( new RenderPass( scene, camera ) );
composer.addPass( new EffectPass( camera, new BloomEffect(), new SMAAEffect() ) );

function animate() {
  composer.render();
}
主なエフェクト
エフェクト用途
BloomEffectミップマップを使用した設定可能なブルーム
SMAAEffectサブピクセル形態学的アンチエイリアス
SSAOEffectスクリーンスペースアンビエントオクルージョン
DepthOfFieldEffectボケによる被写界深度
ToneMappingEffectトーンマッピングオペレーター
VignetteEffect画面端の暗化
ChromaticAberrationEffect色収差
NoiseEffectフィルムグレイン
GodRaysEffectボリュームライトの散乱

React Three Fiber では、これらのエフェクトを JSX コンポーネントとしてラップする @react-three/postprocessing を使用してください。


リサイズ処理

ウィンドウのリサイズ時には、レンダラーとコンポーザーの両方を必ずリサイズしてください。

window.addEventListener( 'resize', () => {
  camera.aspect = window.innerWidth / window.innerHeight;
  camera.updateProjectionMatrix();
  renderer.setSize( window.innerWidth, window.innerHeight );
  composer.setSize( window.innerWidth, window.innerHeight ); // MUST resize
});

WebGPU ポストプロセッシング

WebGPU レンダラーでは、別個のノードベースシステムを使用します。

import { PostProcessing } from 'three/addons/tsl/display/PostProcessing.js';

const postProcessing = new PostProcessing( renderer );
// Uses TSL (Three Shading Language) node graphs for effects

これは、組み込みの WebGL EffectComposer と pmndrs/postprocessing のどちらとも完全に互換性がありません。


リファレンスリンク

公式ソース

コメント