高度なトピック

手動でライトマップを渡す

ライトマップは、隣接するピクセルを使用して前面サーフェスおよび後面サーフェスのライト データを格納し、カメラ空間でレンダリングされます。これらは水平方向に隣接しているため、ライトマップの幅は高さよりも大きくなくてはならないということになります。前面サーフェスと後面サーフェスの 500 × 500 の実際のサンプルが必要であれば、ライトマップは 1000 × 500 ピクセルでなくてはなりません。

ライトマップは 32 ビットのテクスチャである必要があります。Z 深度情報はアルファ コンポーネントに格納されるので、必ず浮動小数点 RGBA が必要です。メモリを節約するためのオプションとして、わずかなパフォーマンスの低下を伴うものの、50 %のメモリ容量で済む、.exr フォーマットを使用することもできます。

  depthmap はユーザが割り当てることはできず、自動モードでのみ使用されます。唯一の目的は若干のメモリ/パフォーマンスの最適化です。

自動でライトマップを生成する

使いやすさを考慮して、ライトマップを適切なフォーマットで明示的に渡す必要はありません。ただし、すべてのパーティシペイト シェーダは使用されるライトマップを認識する必要があるので、最初の 2 つのパラメータがライトマップとデプスマップのペアである、特殊な種類のフェノメナを使用します。フェノメナの内部でシェーダを使用する場合は、特定の値に設定する代わりに、interface による接続を介して最初の 2 つのパラメータにリンクする必要があります。

これらの条件が満たされた場合のみ、ライトマップの自動生成が使用できます。条件を満たさなかった場合は、ライトマップを手動で指定する必要があります。

次に示すのは、これらの条件を満たすフェノメナの擬似コードです。

declare phenomenon 
    material "my_sss_phenomenon" (
        color texture     "lightmap",                  # must be first
        color texture     "depthmap",                  # must be second
        color             "diffuse_paint",
        color             "my_special_color",
        scalar            "lightmap_size",             # for example
        ...
    )
    shader "myscattering" "misss_fast_shader" (
        "lightmap"        = interface "lightmap",      # required
        "depthmap"        = interface "depthmap",      # required
        "diffuse_illum"   ...
        ...
    )
    shader "mylightmapping"   "misss_lightmap_write" (
        "lightmap"        = interface "lightmap",      # required
        "depthmap"        = interface "depthmap",      # required
        "lightmap_group"  "A",
        "lightmap_size"   = interface "lightmap_size", # for example
        ...
    )
    ...
end declare

これらのガイドラインに従っていない場合にはフェノメナが予期に反する動作をしたり、シェーダが通信に使用しようとしたパラメータスロットが失われていたり別の用途で使用されていたりする場合には、レンダリングが中止されてしまう可能性もあります。

ネットワーク レンダリング

mental ray は、ライトマップをレンダリングする際に、負荷をオブジェクトごとに複数のホストに分散しようと試みます。しかし、misss_fast_ シェーダでは複数のオブジェクトで同じライトマップを共有することが推奨され(メモリの使用効率のため)、場合によっては(個別のオブジェクトを相互に散乱させるために)複数のオブジェクトで同一のライトマップを共有しなければならないことがあります。

複数のホストから同じライトマップへの書き込みは mental ray では不可能であり、衝突が発生することがあります。このような場合には、不完全または不正なライトマップ データが作成されてしまいます。

この問題を回避するには、以下の方法があります。

ディスプレイスメントを使用する場合には、オブジェクトは自動的にいくつものサブオブジェクトに分割され、個別にテッセレーションおよびライトマップされます。このため、1 つのオブジェクトがいくつものオブジェクトになり、上記の最初の 2 つの回避策は使用できなくなります。

Copyright © 1986, 2012 NVIDIA Corporation