元記事:Displacement_mapping

ディスプレイスメントマッピング



by Robert Wenzlaff氏




機能の解説と用途


ディスプレイスメントマッピングはプロシージャル・画像問わず、Textureの入力をレンダリングされる面の位置の操作に使用できるパワフルなテクニックです。
Normalもしくはバンプマッピングのような、法線を曲げて幻の凹凸を与えるものではなく、
これは実際に凹凸を作るものなのです。これらは影を投影し、他のObjectを隠し、実際の形状でできることをすべて行うのです。


シェーダ・シャドウバッファ・レイトレーサにはどうやってあなたがモデリングしたかは判りません。

ディスプレイスメントマッピングはテクスチャチャネルとして振舞うよう設定されますが、ひとつ重要な大きな違いがあります。

レンダリングするFaceの移動をスムーズにするためには、面を非常に小さくしなければなりません(1)。これにはメモリとCPUの時間を食います。

遠くの物・重要でない物の場合、まだNORマッピング(バンプマッピング)を使用すべきでしょう。NORマッピングと比べ、ディスプレイスメントはレンダリングする各Faceにさらに非常に小さな負荷をCPUに負わせます。しかし、NORマッピングではレンダリングFace数とは独立して使用できます。ディスプレイスメントの使用により一気に非常に多くのFaceのあるシーンになります。

あなたのシーンにより正確な形状を使用する必要がある時にディスプレイスメントを使用して下さい。(一番右端の"cube"の影に注意して下さい)

(1)私は本当に必要なFaceだけを分割するアダプティブサブディバイド(適応再分割)について作業中です。例:もしカメラから遠く離れている、もしくはテクスチャの変位が緩やかな場合、そのFaceが大きいままの方がレンダリングスピードが上がります。

現在、最大二つのレンダリングFaceがMeshのFace毎(もしくは他のObject上の同等のもの)に生成されます。もし四角形のFaceが平面でなければ、二つの三角形としてレンダリングされます。

編集中のPCが沼に足をとられることなく、高いレンダリングFace数を得るには、MeshをSubSurfして下さい。implicit surfaceのFace(灰色)はレンダリングFaceとなるFaceです。

ObjectのMaterialのWIREの設定、ALL EDGES(EditMode中)の選択は、ディスプレイスされるレンダリングFaceを視覚化するのにいい方法です。

レンダリング時、Edgeを丸くせずにSubdivideできるように、新しいタイプのSubSurf、"Simple SubSurf"が作られました。"Simple SubSurf"をSubdivideのタイプとして選択することにより、Meshはレンダリング時、全体的な概観が変更されることなく、render数値ボックスのレベルでSubdivideされます。

すばやい編集には、3DViewでのSubdivideレベルを低く保ち、レンダリング時のSubdivideレベルを高くするのが一番いい方法です。しかし使用には注意して下さい。SubSurfのメモリ使用量は恐ろしいほど多くなります。これによりコンピュータが長い長い間ロックされてしまうのもめずらしくありません。


ディスプレイスメントの適用対象


最適な場合から最悪な場合まで、下記の各Objectタイプそれぞれについてレンダリング時のFace数をコントロールする方法と適用についてあげていきます。

下記も利用可能ですが、現在は上手く動作しません。ディスプレイメントを適用する前にMeshに変換することをお勧めします。



ディスプレイスメントの使用方法


簡単には、上記の方法で表面を小さなレンダリングするFaceに分割してやり、好みのテクスチャでディスプレイスメントを使用(訳注:Dispボタンを押す)します。

しかし…。

現在、ディスプレイメントの動作には二つのモードがあります。

* 輝度によるレンダリングVertexのディスプレイスメント(VertexはVertexのNormalに沿って移動します)

* TextureのNormalによるレンダリングVertexのディスプレイスメント(VertexはTextureのNorに従って移動します)

二つのモードは排他ではありません。それぞれのタイプの量はMaterial→MapToパネルのスライダを使用して混ぜることができます。Textureのすべてが両方のInputのタイプを提供するわけではありません。例えばStucciはNormalだけを提供し、Magicは輝度のみを提供します(Colorから)。Cloud、Wood、Marbleは両方を提供します。Imageは輝度とNormalの両方を提供します。

輝度によるディスプレイスメントはDispスライダによってコントロールされます。

NormalによるディスプレイスメントはNorスライダによってコントロールされます。

輝度によるディスプレイスメントは、Vertexが外側にのみディスプレイメントされるため、スムーズで、より連続的な表面になります。NormalによるディスプレイスメントはVertexが様々な方向にディスプレイスメントされるため、より密集した表面になります。

ディスプレイスメントの深さはそのObjectのSizeによりますが、データの大きさには関係ありません。

これはもしObjectModeであるObjectの大きさを二倍にすると、ディスプレイスメントの深さも二倍になり、相対的にディスプレイスメントは同じになることを意味します。

もしEditMode中で大きさを変化させても、ディスプレイスメントの深さは変更されず、相対的な深さは小さくなります。

ニュートラルグレイはディスプレイスメント0を意味します。

正のディスプレイスメントは、白が頂点で、黒が谷底です。

負のディスプレイスメントは、これが反転します。

ディスプレイスメント用マップを作成する際、最初に50%のグレイで埋めてください。このCubeのEdgeを正しくシャープに残す方法に注意してください。もし背景が50%グレイでない場合、ベベルもしくは縁ができるでしょう。TextureButtons→ColorパネルのBrightnessとContrastスライダをして調節もできますが、前者の方が正しくスタートするためにベストな方法です。

ディスプレイスメントマップ内のシャープなラインはレンダリングするFaceを構成するVertexの一つが他の2-3のVertexに対して移動距離が非常に大きくなることがあるため、Normalの問題を引き起こす可能性があります。使用する前にあらかじめガウシアンぼかしをその画像に少しかけてあげるといい結果が得られるかもしれません。

注意:
TextureのOSAは現在Imageをディスプレイスメントマッピングした場合は動作しません。適切なフィルターサイズ機能の関数を置く必要があります。