UV & materials

Parallax Mapping / Bump Offset

パララックスマッピング

高さに応じてUVをずらし奥行きを見せる。

5 / 10

Interactive demo

Preparing the demo…

Parallax Mapping / Bump Offset

Drag to orbit, Ctrl/⌘ + scroll to zoom. Use two fingers on touch screens.

This explanation is currently available in Japanese.

ひとことで

平らな面に高さマップを持たせ、視線の角度と高さに応じてテクスチャを読む位置をずらすことで、凹凸が本当に奥へへこんでいるように見せる手法です。法線マップが「光の当たり方」だけを変えるのに対し、パララックスマッピングは「どこが見えるか」まで変えるので、斜めから見たときの奥行きが格段に増します。

ゲームでの使いどころ

  • 石畳・レンガの壁・タイル床:目地が奥にへこみ、石が手前に出っ張って見える。
  • 地面のディテール:足跡、轍、ひび割れ、砂利。
  • 窓の奥の部屋:ビルの窓に室内が見えるように見せる「インテリアマッピング」も、同じ視差の考え方の応用です。
  • SF のパネル・計器:実際のポリゴンを増やさずに、ボタンの溝やパネルの段差を表現する。

しくみ

接空間(面に沿った座標系)での視線ベクトルを v=(vx,vy,vz)\mathbf{v} = (v_x, v_y, v_z)、高さマップを h(uv)h(\mathbf{uv})、深さの倍率を ss とします。

パララックスマッピング(オフセット)は、その点の高さだけを使って 1 回で UV をずらします。

uv′=uv−vxyvz (1−h) s\mathbf{uv}' = \mathbf{uv} - \frac{\mathbf{v}_{xy}}{v_z}\,(1 - h)\,s

計算は軽いものの、急な角度や深い凹凸では、ずらす量の見積もりが外れて模様が崩れます。

視差遮蔽マッピング(POM) は、視線に沿って層を少しずつ進みながら高さマップをたどり、視線が表面の下に潜った最初の位置を探します(スフィアトレーシングと同じ「光線を進めて交点を探す」考え方です)。見つかった区間を線形補間して交点を求めるので、手前のレンガが奥の目地を隠す様子まで表現できます。視線が面に対して寝ているほど層の数を増やします。

手法1 画素あたりの読み込み表現できるもの
法線マップのみ1陰影だけ(輪郭・奥行きは平面)
パララックス2浅い凹凸の奥行き
視差遮蔽(POM)10〜50深い凹凸、遮蔽、(追加で)自己影

実装のポイント

  • 接空間の視線が必要:通常のメッシュでは、頂点の接線・従法線から TBN 行列を作り、視線を接空間へ変換します(デモの板は xy 平面なので省略しています)。
  • 求めた UV を全部に使う:色、法線、粗さなど、すべてのテクスチャを補正後の UV で読みます。
  • 縁の処理:UV が 0〜1 の外へずれると、タイリングしない素材では縁に別の模様が現れます。範囲外なら discard する方法もあります。

つまずきやすい点

  • 輪郭は変わらない:どれだけ奥行きが出ても、メッシュのシルエットは平らな板のままです。真横から見ると平面だと分かります。本当に形を変えたいならテッセレーションや頂点変位を使います。
  • 急な角度での段差:POM の層数が少ないと、斜めから見たときに階段状の縞(スライス)が見えます。
  • コスト:画面を大きく占める床に POM を使うと、1 画素あたり数十回のテクスチャ読み込みになります。距離に応じて層数を減らすか、近景だけに使います。

デモで試すこと

  1. 「凹凸の表現」をなし → 法線マップのみ → パララックス → 視差遮蔽と切り替えてください。法線マップだけでは、斜めから見るとレンガが平面に描かれた絵だと分かります。
  2. 視点を横に回して壁を斜めから見ると、POM ではレンガの側面が見え、手前のレンガが奥の目地を隠します。
  3. 「凹凸の深さ」を最大にすると、パララックスは崩れやすく、POM は深い凹凸にも耐えることが比べられます。

References

Unreal Engine Material Coordinates ↗

A general reference for this subcategory.