TL

テッセレーションと変位マッピング

粗いメッシュから GPU 上で滑らかな曲面と本物の凹凸を生成する仕組みを、制御点・パッチ・テッセレーションファクタから理解し、LOD の亀裂を出さない設計を選べるようになります。

応用グラフィックステッセレーション変位マッピングLODGPU最終更新: 2026-06-21
TL;DR要点だけ先に
  • 1.ハードウェアテッセレーションは制御点パッチをハル→固定機能テッセレータ→ドメインの3段で細分し、頂点データの転送を抑えつつ近距離で滑らかな曲面を GPU 上で生成する。
  • 2.テッセレーションファクタで分割密度を画面サイズや距離に応じて動的に変えられ、これ自体が連続 LOD として働くが、隣り合うパッチで共有辺のファクタが食い違うと亀裂(クラック)が開く。
  • 3.変位マッピングは高さテクスチャで生成頂点を法線方向へ実際に動かし、ノーマルマップと違い輪郭・セルフシャドウ・視差にも効くが、標本化とファクタの整合を欠くとスイミングや隙間が出る。

テッセレーションが解く問題 ── 転送量と曲面精度の両立

近距離で滑らかな曲面や細かい凹凸を出すには本来、膨大な三角形が要ります。しかしその高密度メッシュをそのまま CPU から GPU へ転送し、頂点シェーダで一つずつ処理するのは、帯域とメモリの浪費です。遠くに置けば数画素にしかならないモデルにも同じ頂点数を払うことになります。

ハードウェアテッセレーション は、この矛盾を「粗い制御メッシュだけを送り、細かい面は GPU が実行時に生成する」ことで解きます。送るのは制御点(コントロールポイント)で構成される パッチ の集合です。各パッチをどれだけ細かく割るかは実行時に決められ、近ければ細かく、遠ければ粗く、と動的に制御できます。これは メッシュとジオメトリ表現 で触れた LOD を、離散的な差し替えではなく連続的に行う手段でもあります。

細分は「頂点を増やす」、簡略化 LOD は「頂点を減らす」

テッセレーションと通常の LOD は方向が逆です。LOD はエッジコラプスなどで遠方の三角形を減らします。テッセレーションは粗いパッチを近距離で細分し三角形を増やします。両者は補完関係で、遠景は簡略化メッシュ、中〜近景はテッセレーションで滑らかに、という使い分けが実務では自然です。

パイプライン上の3段 ── ハル・テッセレータ・ドメイン

テッセレーションは 描画パイプラインの全体像 で言う頂点シェーダとラスタライザの間に挟まる、3つのステージから成ります(DirectX 系の呼称。OpenGL/Vulkan では TCS / テッセレータ / TES)。中央のテッセレータだけが固定機能で、前後の2段はプログラマブルです。

DirectX / OpenGL の名称実行単位役割
1ハルシェーダ / TCS制御点ごと+パッチごと制御点を加工し、テッセレーションファクタを出力する
2テッセレータ(固定機能)パッチごとファクタに従いパッチ内をパラメトリック座標の格子へ細分
3ドメインシェーダ / TES生成頂点ごと各生成点の座標を制御点から評価し、実位置・法線を計算する

流れを具体的に追います。ハルシェーダ はパッチ単位で走り、2種類の出力を出します。一つは加工後の制御点(座標変換や基底変換をかけたもの)、もう一つが後述するテッセレーションファクタです。次に 固定機能テッセレータ は、ファクタだけを見てパッチの内側を規則的な格子に割り、各交点に パラメトリック座標(三角形パッチなら重心座標 (u,v,w)、四辺形パッチなら (u,v))を振ります。この段は座標だけを生成し、実際の3D位置には一切触れません。最後に ドメインシェーダ が各生成点について走り、そのパラメトリック座標と制御点から実際の位置・法線・UV を計算します。

テッセレーション3段のデータの流れ:

  制御点パッチ(例: 三角形パッチ = 制御点3〜10個)
    │  ハルシェーダ: 制御点を加工 + ファクタ算出
    ▼
  テッセレーションファクタ(辺3本+内側)
    │  固定機能テッセレータ: ファクタに従い格子生成
    ▼
  生成頂点のパラメトリック座標 (u,v,w) の列  ← 位置はまだ無い
    │  ドメインシェーダ: 制御点から実位置を評価
    ▼
  実座標を持つ細分三角形 → ラスタライズへ

重要なのは、位置を決めるのはドメインシェーダだけ という点です。テッセレータは「どこに点を打つか(比率)」を出すだけで、その比率を実空間の座標へ写す規則はドメインシェーダの中にあります。平坦なパッチをただ割るなら線形補間で済みますが、PN 三角形や Bézier・B-スプラインといった曲面基底を評価すれば、粗い制御メッシュから滑らかな曲面が立ち上がります。

テッセレーションファクタと連続 LOD

ハルシェーダが出す テッセレーションファクタ は、パッチをどれだけ細かく割るかの指定です。三角形パッチなら「3本の辺それぞれの分割数(エッジファクタ)」と「内側の分割数(インナーファクタ)」を出します。四辺形パッチなら辺4本+内側2方向です。辺と内側を分けて持つのが肝で、この設計が次節のクラック回避に直結します。

ファクタを距離や画面上のパッチ長で動的に決めれば、そのまま 連続 LOD になります。よく使う指標は、辺の両端点を投影したスクリーン距離を、望ましい三角形エッジ長(例: 8〜16 画素)で割った値です。近づけば辺が長く映るのでファクタが上がり細かくなり、遠ざかれば下がって粗くなります。離散 LOD のようにメッシュを丸ごと差し替えないため、切り替えの瞬間に形が飛ぶ ポッピング が原理的に起きにくいのが利点です。

細分しすぎはサブピクセル三角形とクアッドオーバーシェーディングを招く

ファクタを上げれば上げるほど良いわけではありません。生成三角形が画面上で1〜2画素を切ると、ラスタライズの原理 で言うエッジ判定やシェーディングの効率が急落します。GPU は 2×2 画素(クアッド)単位でフラグメントを処理するため、極小三角形はクアッドの大半が無駄になる「クアッドオーバーシェーディング」で塗り面積の何倍もシェーダを走らせます。三角形エッジ長が数画素を下回らないよう、ファクタは距離で頭打ちにするのが定石です。多くのハードウェアはファクタ上限(64 前後)も持ちます。

亀裂(クラック)とその回避

テッセレーションで最も厄介なバグが、隣り合うパッチの境界に隙間が開く クラック(亀裂)です。原因は単純で、共有する辺の両側で分割数(エッジファクタ)が食い違うと、生成される辺上の頂点位置が一致せず、しかも変位で高さがずれると穴になって背景が透けます。

共有辺のエッジファクタは両パッチで必ず一致させる

2つのパッチが1本の辺を共有するとき、その辺のエッジファクタは 両パッチで同一の値 でなければなりません。ハルシェーダはパッチを独立に処理するため、放っておくと隣と違う値を出しかねません。回避には、エッジファクタを辺の位置(両端の制御点)だけから決定的に計算する ── 例えば辺の中点のスクリーン座標や、両端点間の距離のみを使う ── ことで、どちらのパッチから見ても同じ入力に同じ出力を返すようにします。パッチ固有の情報(重心や面積、パッチ ID)を辺のファクタに混ぜてはいけません。

エッジとインナーを分けて持つ設計は、まさにこのためにあります。内側の密度(インナーファクタ)はパッチごとに自由に変えても、境界は隣と共有する辺の値だけで決まるので継ぎ目が閉じます。テッセレータは辺の頂点を「その辺のエッジファクタ」だけで生成し、内側の頂点を「インナーファクタ」で生成するため、両パッチが同じエッジファクタを与えれば辺上の頂点は完全に一致します。

もう一つの落とし穴が 辺をまたぐ法線と変位の不連続 です。位置が一致しても、境界の頂点で使う法線や高さテクスチャの読み取りが両側で違えば、変位後にやはり隙間や折れが出ます。境界では法線を隣接パッチと平均するか、そもそも辺上の頂点が同じ UV・同じテクセルを読むように UV の連続性を保証しておく必要があります。

クラックが開く条件と回避:

  悪い例(クラックが出る):
    パッチA の右辺ファクタ = round(パッチA の面積由来)  = 5
    パッチB の左辺ファクタ = round(パッチB の面積由来)  = 4
      → 同じ辺上に 5分割 と 4分割 の頂点 → 位置が不一致 → 穴

  良い例(閉じる):
    共有辺のファクタ = f(辺の両端点のみ)  ← A・B どちらから見ても同値
      → 辺上の頂点が完全一致 → 隙間なし
    さらに 境界の法線・変位テクセルも両側で一致させる

変位マッピング ── 実ジオメトリを動かす

テッセレーションが生む大量の頂点は、そのままでは滑らかな「つるつるの」曲面にすぎません。ここに 変位マッピング(ディスプレイスメントマッピング) を重ねると、細かい凹凸を 実際のジオメトリとして 作れます。仕組みは、高さを格納した 変位テクスチャ(ハイトマップ)をドメインシェーダで UV からサンプリングし、その値ぶんだけ生成頂点を法線方向へ動かすだけです。

ドメインシェーダでの変位(概念):

  p     = 曲面評価で得た基準位置(制御点から補間・評価)
  n     = その点の法線
  uv    = その点の UV(制御点から補間)
  h     = sample(変位テクスチャ, uv)   // 0..1 の高さ
  scale = 変位の強さ(モデル空間の単位)

  変位後の位置 = p + n * (h - bias) * scale
    bias は「基準面をどの高さに置くか」の中立オフセット

ここが テクスチャマッピングとフィルタリング で扱うノーマルマップとの決定的な違いです。ノーマルマップは法線だけを差し替えて陰影で凹凸を「偽装」しますが、実際のポリゴンは平らなままなので、輪郭(シルエット)は平らに見え、影も落ちず、視点を動かしても凹凸が視差で動きません。変位は頂点そのものを動かすため、輪郭に凹凸が出て、セルフシャドウが落ち、視差も正しく生じます

観点ノーマルマップ変位マッピング
変えるもの法線(陰影のみ)実際の頂点位置(ジオメトリ)
輪郭・シルエット平らなまま凹凸が出る
セルフシャドウ・遮蔽出ない出る
視差(視点移動での動き)生じない正しく生じる
コスト頂点数は据え置き、安いテッセレーション必須で高い

変位を活かすには テッセレーション密度と高さテクスチャの解像度を釣り合わせる 必要があります。三角形が粗いのに高周波の高さデータを読んでも、頂点間の細かい起伏は表現できません(標本化不足)。逆に頂点が細かくても、高さテクスチャのミップ選択が甘いと、カメラや頂点がわずかに動くたびに読むテクセルが変わり、凹凸が波打つ スイミング(スウィミング) が起きます。変位テクスチャのサンプリングでは、テッセレーション密度に対応したミップレベルを選び、上位ミップでは高さの分散が縮む(=平坦化する)性質を利用して破綻を抑えます。

変位の落とし穴 ── クラックは「位置」だけでなく「高さ」でも開く

前節のクラックは、変位を加えると二重に効きます。共有辺のエッジファクタを揃えて位置を一致させても、境界の頂点が両パッチで異なる UV・異なるミップ・異なるテクセルを読めば高さがずれ、変位後に段差や隙間が生じます。したがって変位ありのテッセレーションでは、(1) 共有辺のエッジファクタ一致、(2) 境界 UV の連続、(3) 境界での変位テクスチャの読み取り一致、の3点をまとめて保証する必要があります。継ぎ目のガター確保やシーム頂点の変位固定が実務的な対策です。

変位のバリエーションと限界

素朴な変位は法線方向への1次元の押し出しなので、オーバーハング(庇のように張り出す形)は作れません。高さは1つのスカラーで、同じ UV に対し高さは1通りしか持てないからです。切り立った崖や生物のディテールなど、真に3次元的な起伏が要る場合はベクトル変位(RGB に xyz のオフセットを格納し、接線空間で頂点を任意方向へ動かす ベクトルディスプレイスメント)を使います。これはノーマルマップと同じ接線空間(TBN)を前提とするため、メッシュとジオメトリ表現 で述べた接線属性が正しく用意されていることが条件です。

試験・面接で問われる勘所

「ノーマルマップと変位マッピングの違いは」と問われたら、ノーマルマップは法線だけを差し替えて陰影を偽装するのでシルエットは平らなまま、変位は実際に頂点を動かすので輪郭・セルフシャドウ・視差にも効く、と答えるのが要点です。加えて「テッセレーションで亀裂を防ぐには」に対しては、共有辺のエッジファクタを両パッチで一致させる(辺の位置だけから決定的に算出し、パッチ固有情報を混ぜない)、変位ありなら境界 UV とテクセル読み取りも揃える、と述べられると理解が伝わります。

まとめ

  • ハードウェアテッセレーション は制御点パッチを ハルシェーダ → 固定機能テッセレータ → ドメインシェーダ の3段で細分し、粗い制御メッシュだけを転送して近距離の曲面を GPU 上で生成する。位置を決めるのはドメインシェーダのみ。
  • テッセレーションファクタ は辺と内側を分けて指定し、距離やスクリーン長に応じて動的に変えれば連続 LOD になる。ただし細分しすぎるとサブピクセル三角形とクアッドオーバーシェーディングで逆効果。
  • クラック(亀裂) は共有辺のエッジファクタ不一致で開く。回避には辺のファクタを両端点だけから決定的に計算し、パッチ固有情報を混ぜないこと。変位ありでは境界 UV とテクセル読み取りの一致も要る。
  • 変位マッピング は高さテクスチャで頂点を法線方向へ実際に動かし、ノーマルマップと違い輪郭・セルフシャドウ・視差に効く。テッセレーション密度と高さ解像度を釣り合わせないとスイミングや標本化不足で破綻する。
  • オーバーハングなど真に3次元の起伏には、接線空間で任意方向へ動かす ベクトルディスプレイスメント を使い、正しい接線属性を前提とする。

グラフィックス Article

テッセレーションと変位マッピングを実務で読む

TL;DRは入口です。実際に選ぶ・使う段階では、何を解決するか、何と比較するか、導入後にどこで詰まるかまで見る必要があります。

解決すること

グラフィックス

比較で見る軸

難易度: advanced / カテゴリ: グラフィックス / タグ数: 5

導入後に効く点

テッセレーションファクタで分割密度を画面サイズや距離に応じて動的に変えられ、これ自体が連続 LOD として働くが、隣り合うパッチで共有辺のファクタが食い違うと亀裂(クラック)が開く。

先に潰すリスク

用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。

数字・仕様の読み方
難易度
advanced
カテゴリ
グラフィックス
タグ数
5

判断チェックリスト

  • 自社の用途が「グラフィックス / テッセレーション」に近いか確認する。
  • 強みである「ハードウェアテッセレーションは制御点パッチをハル→固定機能テッセレータ→ドメインの3段で細分し、頂点データの転送を抑えつつ近距離で滑らかな曲面を GPU 上で生成する。」が本当に評価軸になるか確認する。
  • 注意点の「用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。」を運用で吸収できるか確認する。
  • 公開値や仕様値は、対象プラン・対象機種・対象リージョンまで確認する。
  • 既存システム、ID、ネットワーク、監視、バックアップとの接続方法を先に洗い出す。
  • 小さく試してから、本番移行、権限設計、障害時手順、コスト監視を決める。

次に確認する観点

グラフィックステッセレーション変位マッピングLODGPUグラフィックステッセレーション変位マッピング