メインコンテンツまでスキップ

シーンのレンダリング

RenderPassForward は、1 つのカメラでシーンのレイヤーをレンダリングする RenderPass です。エンジンがシーンのレンダリングに使用するパスでもあります。カメラの framePasses で使用すると、シーンを独自のレンダーターゲットにレンダリングし、表示される前に独自のパスで処理できます。

パスの作成​

グラフィックスデバイス、シーン、レイヤーをレンダリングするカメラコンポーネントを指定してパスを作成します。レンダリング先のレンダーターゲットで初期化し、レンダリングするレイヤーを順番に追加します。

const worldLayer = app.scene.layers.getLayerByName('World');
const uiLayer = app.scene.layers.getLayerById(LAYERID_UI);

const scenePass = new RenderPassForward(app.graphicsDevice, app.scene, cameraEntity.camera);
scenePass.name = 'ScenePass';
scenePass.init(renderTarget);

scenePass.addLayer(worldLayer, false);
scenePass.addLayer(uiLayer, true);

各レイヤーには、不透明と透明のサブレイヤーがあります。addLayer の 2 番目の引数でどちらをレンダリングするかを選択するため、両方をレンダリングするにはレイヤーを 2 回追加します。パスがレンダリングするレイヤーは、カメラもレンダリングする必要があります。CameraComponent#layers を参照してください。

パスが毎フレーム行うこと​

パスは、カメラがレイヤーをレンダリングするのと同じ方法でレイヤーをレンダリングします。

  • カメラとレイヤーのクリアフラグの要求に従って、レンダーターゲットをクリアします。そのレイヤーでクリアしないようにするには、addLayer の 3 番目の引数に false を渡します。
  • カメラに対してレイヤーのメッシュインスタンスをカリングし、それらに必要なディレクショナルシャドウをレンダリングします。
  • フレーム内でそのカメラをレンダリングする最初のパスである場合、カメラの beforePasses をレンダリングします。
  • フレーム内でそのカメラをレンダリングする最初のパスからシーンの prerender イベントを、最後のパスから postrender を発火し、レンダリングする各レイヤーの前後で prerender:layer と postrender:layer を発火します。

ガンマ補正とトーンマッピング​

デフォルトでは、パスはカメラのガンマ補正とトーンマッピングでレンダリングします。パスは gammaCorrection と toneMapping でこれらを上書きできます。たとえば HDR パイプラインでは、シーンを浮動小数点のレンダーターゲットにリニアでレンダリングし、後続のパスでトーンマッピングします。一方、UI を画面にレンダリングするパスはカメラの設定を維持します。

scenePass.gammaCorrection = GAMMA_NONE;
scenePass.toneMapping = TONEMAP_LINEAR;

カメラのレンダリングの置き換え​

独自のパスでカメラをレンダリングするには、カメラの framePasses に RenderPassForward を追加し、それがレンダリングした内容を処理するパスも一緒に追加します。たとえば、シーンをテクスチャにレンダリングし、そのテクスチャをシェーダークアッドパスで画面に描画します。カメラは複数のフォワードパスでレイヤーをレンダリングすることもできます。たとえば、まず不透明レイヤーをレンダリングし、次にそれらがレンダリングした内容を読み取る独自のパスを実行し、その後に透明レイヤーをレンダリングします。カメラパスを参照してください。

制限事項​

RenderPassForward を別の RenderPassForward の下にネストすることはできません。つまり、その 前のパスや 後のパス、あるいはパスが自身より前にレンダリングするカメラの beforePasses に入れることはできません。別のカメラで先にレイヤーをレンダリングするには、パスを順番にレンダリングします。たとえば、framePasses 内の通常の FramePass の 前のパスとしてレンダリングするか、優先度の低いカメラでレンダリングします。

例​

フォワードパスが World レイヤーと UI レイヤーをテクスチャにレンダリングし、シェーダークアッドパスがそのテクスチャに色味を付けて画面に描画します。

Render Pass Camera