レンダラー
PlayCanvasは、Gaussianスプラット用に複数のレンダリングパイプライン(レンダラー)を提供します。レンダラーは、スプラットがどのようにソートされラスタライズされるかを決定します。これはシーン全体の設定であり、デフォルトではエンジンが現在のデバイスに最適なレンダラーを自動的に選択します。
利用可能なレンダラー
CPUソートによるラスタライズ(デフォルト)
GSPLAT_RENDERER_RASTER_CPU_SORT
- デフォルトのレンダラーで、WebGL 2とWebGPUの両方でサポートされています。
- スプラットはバックグラウンドのWeb WorkerでCPU上でソートされ、その後ラスタライズされます。
- XRレンダリングやシェーダーカスタマイズを含む、すべての機能をサポートします。
- ソートは非同期で行われるため、カメラが非常に短い時間で大きく動くと、次のソートが完了するまで一時的に少し古い順序が表示されることがあります。
GPUソートによるラスタライズ(実験的)
GSPLAT_RENDERER_RASTER_GPU_SORT
- 実験的であり、WebGPU専用です。WebGLデバイスでは自動的にCPUソートにフォールバックします。
- スプラットはGPU上でフレームごとにカリングおよびソートされ、Web Workerの往復を回避します。これによりソートのレイテンシが低下し、大量のスプラットでもより良くスケールします。
- 機能が限定されており、すべての機能をまだ実装していません。特に、XRレンダリングとシェーダーカスタマイズは現在サポートされていません。
GPUソートレンダラーは実験的で、一部の機能(例:XRレンダリングやシェーダーカスタマイズ)が未実装です。これらに依存するアプリケーションではCPUソートレンダラーを使用してください。
レンダラーの選択
レンダラーは、app.scene.gsplatのシーン全体のGSplat設定で選択します:
// GPUソートレンダラーを要求(WebGPU専用。WebGLではCPUソートにフォールバック)
app.scene.gsplat.renderer = pc.GSPLAT_RENDERER_RASTER_GPU_SORT;
利用可能なオプション:
pc.GSPLAT_RENDERER_AUTO— (デフォルト) 現在のデバイスに最適なレンダラーを自動的に選択します。pc.GSPLAT_RENDERER_RASTER_CPU_SORT— CPUソートによるラスタライズ。pc.GSPLAT_RENDERER_RASTER_GPU_SORT— GPUソートによるラスタライズ(WebGPU専用)。
WebGPUを必要とするレンダラーは、WebGLデバイスではCPUソートにフォールバックします。このフォールバック後に実際に有効なレンダラーを確認するには、currentRendererを読み取ります:
if (app.scene.gsplat.currentRenderer === pc.GSPLAT_RENDERER_RASTER_GPU_SORT) {
// このデバイスではGPUソートが有効
}
ソート
Gaussianは、カメラからの深度に基づいて奥から手前に描画されます。このソートがどこで実行されるかは、有効なレンダラーによって異なります:
- CPUソート:ソートはWeb Workerで非同期に実行され、結果がGPUにアップロードされます。非同期であるため、カメラのトランスフォームが非常に短い時間で大きく変化すると、Workerが順序を再計算する間、短い遅延が発生する場合があります。
- GPUソート:ソートはフレームごとにGPU上で実行されるため、カメラの動きと同期して維持されます。
レンダラーに関係なく、すべてのGSplatComponentのすべてのGaussianは、各コンポーネントが個別にソートされるのではなく、単一のグローバルソートで一緒にソートされます。これにより、コンポーネント間で正しい深度順序が得られ、重なり合う際の可視性とポッピングのアーティファクトが排除されます。詳細については、スプラットレンダリングアーキテクチャを参照してください。
深度バッファの考慮事項
GSplatComponentはレンダリング中に深度バッファに書き込みません。この制限により、アプリケーションで深度バッファデータの読み取りや活用に依存する機能を使用できません。例えば、通常深度バッファを必要とする被写界深度ポストエフェクトは、一般的にスプラットレンダリングとは互換性がありません。
回避策として、スプラットのメッシュベースの近似を生成し、別のレイヤーで深度バッファにレンダリングできます(フレームバッファには書き込まない)。このテクニックにより、Gaussian splatレンダリングの視覚品質を維持しながら、深度依存エフェクトを使用できます。