This is the documentation for Enlighten.

7.11.1.4. メッシュごとのライトマップ

導入とその根拠

シーン作成のニーズに応じて、ジオメトリのインスタンスに対してライトマップの定義を行うか、インスタンスを定義するジオメトリの各メッシュのライトマップに対してライトマップの定義を行うことができます。

既定のジオメトリのインスタンスの一部、また場合によってはすべてについて、単一のメッシュとそれに対応するライトマップを含むジオメトリを指定するだけで充分です。ただし、一部のジオメトリでは、シーンのインスタンスの一部またはすべてには、かなり詳細にレンダリングする必要がある特定の部分と、そうではない部分があります。その場合、ジオメトリ インスタンスごとに 1 つだけ指定されたメッシュとライトマップ解像度では、インスタンスがどれほど小さくても、全部分で最も高い解像度でレンダリングする必要があります。比較的大きなエリア向けには不要な、非常に詳細なライトマップの計算を Enlighten に要求すると、全体的な出力品質に対して許容できないほどのパフォーマンスの低下につながる可能性があります。この問題を回避する必要性から、メッシュごとのライトマップのコンセプトが生じます。ここでは、ライトマップをジオメトリ内の個々のメッシュに割り当てられるため、必要に応じてインスタンスのさまざまな部分に適用できます。

HLBS を使用したメッシュごとのライトマップのベイク

HLBS でこの機能を利用するには、GeoRadiosity にロードしてプリコンピュートし 、結果をベイクするための適切な .scene ファイルを設定する必要があります。従って、最小限の前提条件として、High Level Build System でのベイクページのベイクのための HLBS シーン ファイルの定義セクションで指定されているように、.scene ファイルをベイク向けに設定する必要があります。これにより、互いに異なるライトマップ解像度で、同じジオメトリ内のさまざまなメッシュを指定できる可能性が生じます。

ベイク用に設定されていない単純なシーンの .scene ファイル例は以下のとおりです。

ubox_nobake.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" 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" 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 アセットが含まれています。左と右に二等分されており、それぞれの側に対応するジオメトリ インスタンスが 1 つあり、対応するメッシュの位置を指定する独自の .geom ファイルを持ちます。シーンが GeoRadiosity にロードされ、プリコンピュートされ、ラジオシティを示した際の外観は以下のとおりです。


シーンをベイク可能にするには、HLBS に対し、なんらかの形で lmNamelmType を指定する必要があります。標準的な方法としては、以下の例のようにライトマップ ベイクが必要な各ジオメトリ インスタンスの宣言に lmName および lmType 属性と値を追加して、.scene ファイルを変更します。

ubox_bake.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>

一般的に、<scene name>_default.bp ファイルを編集して、.scene ファイルで定義された lmType 値と一貫性を持たせる必要もあります。このためには、デフォルトの bakeParams nameresolution の指定を必要な値に置き換えます。この場合、<bakeParams name="256x256" resolution="256 256"><bakeParams name="512x512" resolution="512 512"> に置き換えます。

デフォルト値を使用せず、同時にベイク パラメーター (.bp) ファイルも編集しなかった場合、ベイクは直ちに失敗します。


対応するシーンがベイクのために設定され、GeoRadiosity にロードされ、プリコンピュートされ、ベイクされた際の外観は以下のとおりです。



現状では、上の光線はメッシュごとのライトマップ ベイクを行う準備はできていません。これは、各インスタンスに単一の固定ライトマップ解像度が定義されており、インスタンス全体に適用されるためです。インスタンスのさまざまな部分を異なる解像度でレンダリングしたい場合、インスタンスであるジオメトリにこれらの部分に対応する、別々のメッシュをそれぞれ適切な解像度で含める必要があります。実際には、ジオメトリ (.geom) ファイルが 2 つ以上のメッシュを宣言する必要があり、それぞれに解像度を指定します。各メッシュはジオメトリのさまざまな部分に対応し、それぞれ指定された解像度がそのメッシュのライトマップ出力解像度に対応します。

これを示す適切な .scene ファイルは以下のとおりです。

World.scene
<?xml version="1.0" encoding="utf-8"?>
<scene name="World" version="1">
    <instance name="uboxA" systemId="1" paramSet="Interior" geometry="uboxConstant" type="Radiosity" lmName="A" lmType="64x64" position="0.0 0.0 -1200.0" rotation="0.0 0.0 0.0 1.0" />
    <instance name="uboxB" systemId="2" paramSet="Interior" geometry="uboxConstant" type="Radiosity" lmName="B" lmType="512x512" position="0.0 0.0 0.0" rotation="0.0 0.0 0.0 1.0" />
    <instance name="uboxC" systemId="3" paramSet="Interior" geometry="uboxVariable" type="Radiosity" lmName="C" position="0.0 0.0 1200.0" rotation="0.0 0.0 0.0 1.0" />
</scene>

この .scene ファイルは、3 つの ubox アセット インスタンスの例、ジオメトリ uboxConstant の 2 つのインスタンスと、ジオメトリ uboxVariable のインスタンスを示しています。各ジオメトリは、それぞれアセットの半分を提供する 2 つのジオメトリではなく、ubox 全体に対応するようになりました。各ジオメトリには 2 つのメッシュ、つまり対応する .geom で指定されている 2 つのメッシュ (.pim ファイル) があり、それぞれ ubox の半分にあたります。

uboxConstant ジオメトリのインスタンス uboxAuboxB にはそれぞれ定数があり、以前のように属性 lmType を使用して全体に固定解像度 (64x64 または 512x512) を指定しています。一方で、uboxVariable のインスタンス uboxC では .scene ファイルで解像度が指定されていません。これは、指定するとインスタンス全体に固定の解像度が設定されますが、今回はインスタンス内の解像度に変化を持たせることを意図しているためです。その代わり、.geom ファイルはジオメトリ uboxVariable の半分ずつ、合計 2 つのメッシュを指定しており、.geomlmType を使ってそれぞれの解像度が指定されています。

uboxVariable.geom
<?xml version="1.0" encoding="utf-8"?>
<geom id="" name="uboxVariable" version="4">
    <mesh name="ubox_left" filename=".\ubox_left.pim" lmName="Left" lmType="64x64" direct="true" indirect="true" target="true" doAtlassing="false" deferProjection="false" uvChannel="0" lodLevel="0" />
    <mesh name="ubox_right" filename=".\ubox_right.pim" lmName="Right" lmType="256x256" direct="true" indirect="true" target="true" doAtlassing="false" deferProjection="false" uvChannel="0" lodLevel="0" />
</geom>

従って、この場合 ubox の左半分のライトマップ出力解像度は 64x64 に設定され、右半分は 256x256 に設定されています。

比較のため、uboxConstant インスタンスの .geom ファイルを以下に示します。

uboxConstant.geom
<?xml version="1.0" encoding="utf-8"?>
<geom id="" name="uboxConstant" version="4">
    <mesh name="ubox_left" filename=".\ubox_left.dae" lmName="Left" direct="true" indirect="true" target="true" doAtlassing="false" deferProjection="false" uvChannel="0" lodLevel="0" />
    <mesh name="ubox_right" filename=".\ubox_right.dae" lmName="Right" direct="true" indirect="true" target="true" doAtlassing="false" deferProjection="false" uvChannel="0" lodLevel="0" />
</geom>

各メッシュ宣言には lmType 属性がないことがわかります。これは、この属性がジオメトリ全体と .scene ファイルのすべてのインスタンスに対して設定されているためです。

明らかに、ベイク パラメーター (.bp) ファイルも、これらの複数のライトマップ出力解像度と一貫するように構成する必要があります。これは以下の例で示すように、以前の .bp ファイルの変更例を拡張することで実現できます。

World_default.bp
<?xml version="1.0" encoding="utf-8"?>
<bakeParamsList version="1">
    <bakeParams name="64x64" resolution="64 64" packUVs="false">
    </bakeParams>
    <bakeParams name="256x256" resolution="256 256" packUVs="false">
    </bakeParams>
    <bakeParams name="512x512" resolution="512 512" packUVs="false">
    </bakeParams>
    <bakeParams name="512x512_NoEmissive" resolution="512 512" packUVs="false">
        <solver disableEmissive="true" />
    </bakeParams>
</bakeParamsList>

上記の設定により、以下のように段ごとに 1 つの ubox を持つ 3 段のシーンが生じます。

uboxConstant のインスタンスの 1 つの固定解像度は 64x64 であり、もう一方の解像度は 512x512 です。また、uboxVariable のインスタンスの 1 つは左半分の解像度が 64x64、右半分は 256x256 であり、左と右のメッシュにそれぞれ別の解像度が対応しています。これについては、ベイク解像度を示す以下のスクリーンショットで確認できます。

下の段では解像度が非常に低くなっています (64x64) 一様であることが明確です。中央の段も一様ですが、高くなっています (512x512)。また、上の段では ubox の左側が低解像度 (64x64) でレンダリングされているのに対し、右側は比較的高解像度でレンダリングされています (256x256)。

付録 - その他の考察

前述の内容から、異なる解像度でインスタンスの部分部分をレンダリングするには、ほぼ同等の 2 つの方法があります。

(a) ジオメトリをサブジオメトリに分割し、後者を独自のインスタンスを持つ新しいジオメトリとして再定義します。

(b) ジオメトリ内で複数のメッシュを定義し、シーンに必要なインスタンスを使用します。

一般的には、後者が選ばれます。これは、ジオメトリの数を増やすと、同じジオメトリ数で配分されるメッシュの数を増やすよりも大幅に計算のコストが高まるためです。これは Enlighten でのジオメトリ操作方法が原因です。実際に、シーン要素の複数の領域では同じ数のメッシュが依然として必要とされるため、インスタンスごとのライトマッピングでは計算コストが不必要にかさみます。従って、ジオメトリを分割してジオメトリ/インスタンスごとに 1 つのメッシュを付与すると、計算の負荷が非常に大きくなるばかりでメリットはありません。

全体として、メッシュごとのライトマップ ベイクの方が戦略として明らかに優れています。特に、シーンの要素すべて、またはそのほとんどで、詳細なレンダリングを必要とする領域が同じ場合、発生する類似の要素はすべて、1 つの特定のジオメトリのインスタンスになります。これが最も一般的なシナリオです。

一方で、位置が異なるものの、その他は同一のシーン要素に対して異なるライトマップ解像度の分配 (異なるメッシュ セット) が必要になることがあります。これは状況によって異なるため、単一の固有のジオメトリのインスタンスとしては実装できません。この場合、明らかに個別のケースに個別のジオメトリを定義する必要があり、それぞれが独自の特定のメッシュのセットを持つ必要があります。このためジオメトリの数は増えますが、一般的にはインスタンスごとのライトマップよりもよく利用されます。その理由としては、メッシュの数は同じでも、ほとんどの場合はさらに多くのジオメトリを生成する必要があるからです。例外となるのは、必要なシーン要素のサブエリアの大部分が、全体的に同じ配置ではないものの、要素間で再使用可能になる場合です。これらはジオメトリとして定義した後、さまざまなコンテキストや多くのシーン要素の組み合わせにインスタンスを複数回生成できます。