This is the documentation for Enlighten.

7.11.1. High Level Build System でのベイク


概要

このセクションでは、HLBS にライトマップのベイクがどのようにインテグレートされているかを説明します。

HLBS (High Level Build System) の知識があることを前提としています。

HLBS へのベイクの拡張

ライトマップ ベイクは、以下のビルド ターゲットにより HLBS を拡張します。

  • BakeOutputDirectTextures
  • BakeOutputIndirectTextures
  • BakeOutputAOTextures
  • BakeAllTextures (上記のすべてを 1 つのステップでベイクします)

インテグレート コードで合成を処理することを前提としています。コンポジターの例は、 GeoConvert サンプル アプリケーションに含まれています。
ベイクが成功すると、出力は以下で確認できます。

__Build_<sceneName>__/baking/<lightsFile>

ベイクされたシーン例
入力:

入力アルベド

入力エミッシブ

出力:

AO

直接光

間接光

合成

GeoRadiosity での最終結果

直接、間接、合成テクスチャのアルファ チャネルには、ピクセル有効性に関する情報が含まれます。アルファ チャネルでの 0 の値はピクセルが無効であることを意味し、1 の値は有効であることを示します。

ベイクのための HLBS シーン ファイルの定義

ベイクのためにシーンを準備するには、HLBS .sceneファイルに以下のタグを追加する必要があります。

  • lmName — ライトマップ出力ターゲットを指定します
  • lmType — 出力ライトマップ ターゲットのベイク パラメーターを指定します

ベイク パラメーターのセットは別のファイル <sceneName>_default.bp で指定されます (以下のシーンファイル例を参照)。このファイルは、インスタンスを各ライトマップ出力にマッピングします。1 つのライトマップが固有の lmName/lmType ペアごとに生成されます。ライトマップ ターゲットへのマッピングは、Enlighten のシステムへのマッピングと直交します。単一のライトマップ ターゲットには複数の Enlighten のシステムのインスタンスを含めることができ、単一の Enlighten のシステムのインスタンスを複数のライトマップ ターゲットに含めることができます。

ベイク パラメーターの詳細については、ベイク パラメーターをご覧ください。

同じターゲットが割り当てられた 2 つ以上のインスタンスに、異なる lmType を割り当てると、各インスタンスで異なるライトマップが生じます。単一の出力ライトマップにインスタンスをマッピングするには、lmNamelmType が同一である必要があります。

シーン ファイル例

ubox.scene
<?xml version="1.0" encoding="utf-8"?>
<scene name="ubox" version="1">
    <instance name="ubox_left" systemId="2" paramSet="Interior" geometry="ubox_left" type="Radiosity" lmName="B" lmType="512x512" position="-1000.0 0.0 0.0" rotation="0.0 0.0 0.0 1.0" />
    <instance name="ubox_right" systemId="1" paramSet="Interior" geometry="ubox_right" type="Radiosity" lmName="A" lmType="512x512" position="1000.0 0.0 0.0" rotation="0.0 0.0 0.0 1.0" />
    <volume name="Box01" probesParamSet="Cull_L1">
        <resolution x="5" y="5" z="5" />
        <size x="929.905" y="1713.1" z="932.167" />
        <position x="-467.011" y="-956.056" z="36.7885" />
        <basis>
            <U x="1.0" y="0.0" z="0.0" />
            <V x="0.0" y="1.0" z="0.0" />
            <N x="0.0" y="0.0" z="1.0" />
        </basis>
    </volume>
</scene>
ubox_default.bp
<?xml version="1.0" encoding="utf-8"?>
<bakeParamsList version="1">
    <bakeParams name="512x512" resolution="512 512" packUVs="false"/>
</bakeParamsList>

HLBS でのライトマップ UV の取り扱い

ライトマップを生成するには、ライトマップ ターゲットに入る入力インスタンスに適切な UV ストリームが必要です。UV ストリームは以下の基準を満たす必要があります。

  • UV は範囲 [0,1] にあり、ライトマップと同じアスペクト比である必要があります。たとえば幅 512 と高さ 1024 のライトマップは、範囲 [0,0.5]x[0,1] の UV を持つ必要があります。
  • インスタンスの UV は重複してはなりません
  • 各チャートの周りに少なくとも 1 ピクセルの境界があるように、個々のチャートを分ける必要があります。
  • チャートは、適切な解像度になるように相対的にスケーリングする必要があります。

デフォルトでは、入力メッシュのチャート UV がライトマップ UV として使用されます。ベイクのみのための別の UV のストリームを指定したい場合、各ジオメトリに対し IBakeInputGeometryUvs オブジェクトを作成し、ジオメトリ フォルダにジオメトリと同じファイル名で .bakeuvs 拡張子のシリアル化ファイルを配置します。

別のワークフロー モデルでは、各インスタンスに個別の重複する UV を作成し、その後、Enlighten パッカーを使用してライトマップ ターゲットのインスタンスを上記の要件を満たす単一の UV ストリームにリパックします。これは、出力ライトマップ ターゲットのベイク パラメーター ファイルで有効にできます。

[...]
<bakeParams name="512x512" resolution="512 512" packUVs="true"/>
[...]

低レベル ベイク API に低レベル プリコンピュート API とは別のチャート UV を渡す場合、シーンの各ジオメトリに対して IBakeInputGeometryUvs クラスのオブジェクトを生成する必要があります。このファイルはシリアル化された IPrecompInputGeometry オブジェクトと同じファイル名で、.buv 拡張子にする必要があります。

アルベドおよびエミッシブ入力の提供

ベイクでアルベドおよびエミッシブ テクスチャを使用するには、各テクスチャを RuntimeTexture オブジェクトにコピーし、ディスクに保存します。

  1. 使用している .bp ファイルの先頭に albedoRendered="EnlightenSystems" 属性を追加します
  2. BakeTextures/<Albedo|Emissive><systemId><paramSet>.rt と名付けたファイルにテクスチャを書き出します
  3. BakeAllTextures ターゲット (または別のコンポーネント) を計算します

代わりに、各メッシュ/ジオメトリにアルベドを提供したい場合、さらに作業が必要になる場合があります。Enlighten での出力ライトマップのパッキングでは、状況が矛盾することになります。各ライトマップに提供されたアルベドとエミッシブ テクスチャはライトマップ UV 空間にありますが、シーンをベイクするまでは利用できなくなります。これを解決するために、ライトマップへの UV のパッキング用に追加のビルド ターゲット CreateBakeUVs が提供されています。このステップでは、各ターゲット ライトマップに対する UV ファイルを __Build_<sceneName>__/baking フォルダに出力します。次に、これらの UV をロードし、ライトマップのためにこれを使用してアルベドとエミッシブ入力をラスタライズできます。

従って、プリコンピュート ワークフローは以下のようになります。

  1. CreateBakeUVs ターゲットを計算します
  2. 生成された UV ストリームを読み取ります
  3. ライトマップ UV ストリームを使用して、インスタンスをアルベドとエミッシブ テクスチャにラスタライズします
  4. __Build_<sceneName>__/baking/<Albedo|Emissive><lmName><lmType>.tex と名付けたファイルにテクスチャを書き出します
  5. BakeAllTextures ターゲット (または別のコンポーネント) を計算します

パッキングしない場合、上記のステージ 1 と 2 は省略します。

Static Set Dressing インスタンス

インスタンスは、.xml ファイルでインスタンス エントリーのタイプ タグを設定することにより、Static Set Dressing (SSD) としてタグ付けできます (前述のシーン ファイル例を参照)。Static Set Dressing は、ベイクされたシャドウをターゲット ライトマップに落とし、AO ソリューションに影響を与えるという点が動的オブジェクトとは異なります。ただし、直接光を受けず、ラジオシティ計算に含まれることはありません。SSD タイプは、それ以外の方法ではラジオシティ計算に大きな影響を与えない、小さなオブジェクトに適しており、プリコンピュートを高速で実行することができます。レンダリング中、プローブ ライティングと GPU で生成された直接光により、これらにライティングを行うことができます。

バックフェースの取り扱い

リアルタイム レンダリングではほとんどの場合、パフォーマンスを理由としてバックフェースは無視されます。その一方、シャドウ マッピングのアーティファクトを避ける方法の 1 つとして、シャドウ マップ レンダー パスのバックフェースのみをレンダリングします。一貫したライティングを実現するため、Enlighten では直接および間接ライトマップ ベイクの両方でバックフェースの取り扱いを指定できます。間接ライト マップのベイクの制御は、リアルタイム間接光で使用されているものと同じです。

Shadowface の取り扱い

直接光のベイクでは、shadowFaces ベイク パラメーター属性または shadowfaceBehaviourType マテリアル属性を使用して表向きの三角、裏向きの三角、またはその両方がシャドーイングで使われるかどうかを指定できます。ベイク パラメーターページの shadowFaces.mats 形式参考ドキュメントの shadowfaceBehaviourType をご覧ください。

ベイクされたプローブ セット

プローブ セットによりシーンのベイクに成功すると、ライト プローブ データが利用可能になります。.Scene ファイルで定義されたプローブ セットごとに、ベイクされた L1 球面調和関数を含むファイルを利用できます。次に、これらの L1 プローブを補間し、動的および SSD オブジェクトに間接光を提供することができます。ファイルは、IBakeOutputProbeSet インターフェイスのシリアル化されたオブジェクトである __Build_<sceneName>__/baking/<lightsFile>/<probeSetName>.bpst にあります。

さらに、ベイクされた直接光を備えたプローブを含む __Build_<sceneName>__/baking/<lightsFile>/Direct_<probeSetName>.bpst ファイルが生成されます。lights ファイルで指定された値で合成され、重みづけされた直接と間接光を含む、__Build_<sceneName>__/baking/<lightsFile>/Composite_<probeSetName>.bpst という合成ファイルも生成されます。