RenderPassCameraFrame クラスの拡張
より高度なカスタマイズとして、RenderPassCameraFrame クラスを拡張してカスタムレンダーパスを追加したり、レンダリングパイプラインを変更したりできます。この方法では、組み込みの CameraFrame エフェクトを活かしつつ、パス生成と実行順を細かく制御できます。
概要
RenderPassCameraFrame を拡張すると、次のことができます。
- パイプラインにカスタムレンダーパスを追加する
- 既存のパスを変更または置き換える
- パス実行の順序を制御する
- レンダリングパイプラインから中間テクスチャにアクセスする
例:カスタムレンダーパスの追加
この例では、RenderPassCameraFrame クラスを拡張してレンダリングパイプラインにカスタムレンダーパスを挿入する方法を示します。createPasses() メソッドをオーバーライドすると、シーンテクスチャを対象とする独自の処理ステップを追加できます。collectPasses() メソッドでは、カスタムパスがパイプラインのどこで実行されるかを制御します。この例では最終の compose パスの直前に挿入しています。エッジ検出、カスタムブラー、中間レンダーターゲットが必要な処理など、独自のレンダーパスが要るエフェクトに便利です。
import * as pc from 'playcanvas';
class CustomRenderPassCameraFrame extends pc.RenderPassCameraFrame {
createPasses(options) {
// Call the base implementation to create standard passes
super.createPasses(options);
// Add your custom render pass
this.customPass = new MyCustomRenderPass(this.device, this.sceneTexture);
// You can also modify or replace existing passes here
}
collectPasses() {
// Override to control pass ordering
const passes = super.collectPasses();
// Insert your custom pass at the desired position
// This example inserts it before the compose pass
passes.splice(passes.indexOf(this.composePass), 0, this.customPass);
return passes;
}
}
// Use your custom class by extending CameraFrame
class MyCameraFrame extends pc.CameraFrame {
createRenderPass() {
return new CustomRenderPassCameraFrame(this.app, this, this.cameraComponent, this.options);
}
}
// Create an instance of your custom CameraFrame
const cameraFrame = new MyCameraFrame(app, cameraEntity.camera);
cameraFrame.update();
用途
このアプローチは次のような場合に適しています。
- 独自のレンダーターゲットを必要とするレンダーパスを追加する
- 複数パスにわたる複雑なエフェクトを実装する
- サードパーティのレンダリング手法を組み込む
- パイプラインを細かく制御したい上級ユーザー向け
- 他のパスからの中間結果を処理する必要があるエフェクト