XSIを使ってCubeMapを作成する
NVIDIA DDSファイルに保存してキュービックマッピングなどに使用できます
At 2007/8/31 By Ritaro Okamoto BZP10556@nifty.com

プロローグ
     幾つかの事前情報を提供します。
    キューブ マッピングは、6 面のテクスチャを使用する手法。
    HDR (High Dynamic Range, 高ダイナミックレンジ)形式のフォーマット。
    ILM OpenEXR, ILM が提唱している16bit 浮動小数点サポートの HDRフォーマット、オープンソースとして公開。
    DDS(DirectDrawSurface), Nvidiaが提唱しているDirectX系画像フォーマット、32bit A8R8G8B8が良く使われ、CubeMapTextureやMipMap、Normalmap等対応
    あと、OpenGLが右手系、Direct3D (DDS) は左手系です。

    Softimage | XSI V6.0 Essentials から FX Tree が標準で動かせるようになり、更に .exr ,DDSの読み込み、をサポートしています。
 画像形式・種類について  (ここで紹介している画像はHDRI系元素材を加工したり、Bit数を変更したりして使用しています)
     環境用マップと言っても、ファイルフォーマット・画像形式など色々なものがあります。
    HDRIと言っても .hrd、.map、.tif、.exr など色々あります。
    呼び方まで色々あり、Probe(Light Probe)、Panorama、Hemispherical、Sky Dome、360 Dome ・・・
  


     XSIではどれでも簡単に環境マッピングとして使用できます。
    しかし、リアルタイム系で良く使われている CubeMapはそのまま用意されていることはないでしょう。
    また、OpenGLが右手系であるのに対して、Direct3Dは左手系です。
    再生するエンジンによっては、あるいはレンダリング設定によっては、その順番が違う場合もあるでしょう。
     ここで紹介したいのは、その入手したり加工して得られた元素材がどの形式であっても、
    自分にとって都合の良いCubeMapを XSI上で作成してしまおう という例です。

 CubeMap作成用XSIシーン
     XSI上でCubeMapを作成するシーンを構築します。
    レンダリングされないインプリシットのCubeを中心に置き、内が表のSphereポリゴンを作成します。
    まず、6つの方向を向く6つのカメラを作成します。簡単な名前を付けて解りやすくしてます。
    順番は問わないのですが理解しやすく +X、-X、+Y、-X、+Z -Z、を向くカメラを、
    ピクセル比1、角度90度、注目点はそのCube面の中心です。


    +Y ではカメラがY軸に90度回転-YではカメラがY軸に-90度回転しています。
    並び順は後で説明するFXTree上で簡単に変更できます。

     次に 6つのカメラに1つずつ6つのレンダーパスを設定し、1フレームを縦横比が同じ画像サイズでレンダリングするようにします。
    後にこの名前で FXTree上に並べますので、出力される画像がどの方向のものか解るようにしておきます。



 1) Probe画像例
      このようなProbe画像形式を用意します。

    この画像をXSIのSphereの上部に ロリーポップ方法のテキスチャープロジェクションで貼ります。
    TextureEditor で細かい位置調整、そして下部は黒の部分を使って一点貼りにしておきます。

     

    下部には地面用のテキスチャーを貼りますが、多少重なる部分を作り、画像の端に少しアルファーでぼかしが入るようにしています。
    太陽がある方向が明るくなるように下を回転させるとつじつまをあわせられます。



    Renderモジュールにて、レンダ>すべてのパス を選択して6枚の絵を連続でレンダリングします。
    表示>レイアウト > 合成 で FXTree画面 に移動します。

    ここでは、下記にDDSの例を書いていますので、Direct3Dが左手系ということで、上記XSIの画像並びは、
    +Z
    -Z
    +Y
    -Y
    +X
    -X

     になるようにします。 

     各レンダーパスで出力された6つの画像を +Z、-Z、+Y、-Y、+X、-X 順に並べかえてます。(最初のカメラ番号順とは異なります)
    ここで解ります通り、もしここで6つの並び順が変わるようであれば、接続先を変更するだけで簡単に対応できます。
    ここの例では1つの画像が256x256ですが、512の時は、Transtationの値を512の倍数にするだけです。



     画像出力で [レンダー] ボタンを押してレンダリングさせます。



    あっという間CubeMapの出来上がりです。
    +Z
    -Z
    +Y
    -Y
    +X
    -X


 2) 展開型Probe画像例
     このようなProbe画像形式を用意します。

    この画像をXSIのSphereの上部に 球状方法のテキスチャープロジェクションで貼るだけです。

     

    Renderモジュールにて、レンダ>すべてのパス を選択して6枚の絵を連続でレンダリングします。
    表示>レイアウト > 合成 で FXTree画面 に移動します。
     


     画像出力で [レンダー] ボタンを押してレンダリングさせます。
    あっという間CubeMapの出来上がりです。
    +Z
    -Z
    +Y
    -Y
    +X
    -X


 3) 展開型Panorama画像例
     このようなPanorama画像形式を用意します。

    この画像をXSIのSphereの上部に 球状方法のテキスチャープロジェクションで貼り、UVで上部にします。
    下部は地面のままにしておきました。



    Renderモジュールにて、レンダ>すべてのパス を選択して6枚の絵を連続でレンダリングします。
    表示>レイアウト > 合成 で FXTree画面 に移動します。
     


     画像出力で [レンダー] ボタンを押してレンダリングさせます。
    あっという間CubeMapの出来上がりです。
    +Z
    -Z
    +Y
    -Y
    +X
    -X


  DDS画像例
     CueMapを格納出来る画像フォーマットとしてDDSがあります。
    画像の種類を CubeMapにしてDDSファイルに保存します。



     FREEの画像編集ツールに GIMP http://www.gimp.org/ があり、Windows版 http://gimp-win.sourceforge.net/ があります。
    GIMP用にも DDSファイルやEXRファイル用Pluginが用意されていて大変便利です。
     これで先ほどDDSファイルとして保存した画像を見ると、きちんと6枚の画像がレイヤ分けされていますが、
    各画像とその方向が前から順に +X、-X、+Y、-X、+Z -Z とレイヤ表示している為、XSI画像のXとZが逆に記述している点は注意です。



    Nvidiaのサイトに FXComposer2 がアップされました。これで出来たDDSがあっているか確認してみます。
    同じく、Nvidiaのサイトの Shader Library のページから 
    material environment classic textured あたりの reflections.fx をダウンロードして来て、
    FXComposerでマテリアルとして球に設定します。
    作成したCubeMapのDDSを CUBE MAP 項目の右にあるボタンから選択してテキスチャーとして設定すると
    このようにきちんとしたDDSテキスチャーを作成できたことが確認出来ます。