【TA】浮彫りマッピング(Relief Mapping)
1. 原理
-
精度の高いUVオフセットの計算(視差が大きすぎると破綻することもある)により、より深い奥行きを提供でき、自己シャドウや遮蔽効果も実現可能です。
-
例えば下図のように、浮彫の凸凹の深さがよりはっきりと表れ、自己シャドウ効果も見られます。
- (a)(b)視差マッピング
(c)(d)浮彫マッピング

2. 実装(実装)
-
Relief Mappingは一般的にレイマーチングと2分探索を用いてUVオフセット量を決定します。
○ 第一步:レイマーチングステップ。視差マッピングと同様に進める
○ 後半:2分探索パート。レイマーチングで適切なステップに到達した後、その範囲内で2分探索を用いて精確なオフセット値を求めます。 -
なぜ最初から二分探索を使わないのか?
○ 大きな誤差が発生する可能性がある
//浮雕贴图
float2 ReliefMapping(float2 uv, real3 viewDirTS)
{
float2 offlayerUV = viewDirTS.xy / viewDirTS.z * _HeightScale;
float RayNumber = 20;
float layerHeight = 1.0 / RayNumber;
float2 SteppingUV = offlayerUV / RayNumber;
float offlayerUVL = length(offlayerUV);
float currentLayerHeight = 0;
float2 offuv= float2(0,0);
for (int i = 0; i < RayNumber; i++)
{
offuv += SteppingUV;
float currentHeight = tex2D(_HeightMap, uv + offuv).r;
currentLayerHeight += layerHeight;
if (currentHeight < currentLayerHeight)
{
break;
}
}
float2 T0 = uv-SteppingUV, T1 = uv + offuv;
for (int j = 0;j<20;j++)
{
float2 P0 = (T0 + T1) / 2;
float P0Height = tex2D(_HeightMap, P0).r;
float P0LayerHeight = length(P0) / offlayerUVL;
if (P0Height < P0LayerHeight)
{
T0 = P0;
}
else
{
T1= P0;
}
}
return (T0 + T1) / 2 - uv;
}
3. パララックスオクルージョンマッピング(POM = Parallax Occlusion Mapping)
【TA】Normal Mapping 法線マッピング
1. 紹介
-
Normal Map(ノーマルマップ)とは、物体の局所表面における法線情報を保存したテクスチャのこと。
-
ライティング計算時に、プログラムはこのマップを読み込み、現在のピクセルに対応する法線ベクトルを取得し、それを照明方向と組み合わせてライティングを行う。
-
効果:ノーマルマップを用いることで、通常のテクスチャだけでは表現できない豊かなディテールを視覚的に再現でき、照明方向の変化に応じてリアルタイムに見た目が変化する。
-
生成方法:
2. 実装
法線の格納は、通常モデルの接線空間(Tangent Space)に保存される。
① 保存:接線空間
-
接線空間とは、物体表面の接線・副接線・法線によって構成されるローカル空間のこと。
-
Tangent Space では、座標原点は頂点の位置を基準とする。
-
頂点法線(n)をZ軸とする。
-
残りの2本のベクトルで X軸とY軸 を定義する必要がある。
-
一般的な接線(t)は、テクスチャ座標(UV)と同じ方向の接線ベクトル。
-
副接線(b)は、法線ベクトルと接線ベクトルの外積によって求められる。

なぜ接線空間(Tangent Space)を導入するのか?
1. 自由度が高い
もし法線情報をモデル空間に保存する場合、法線は絶対的な方向であり、
その法線情報は特定のモデル専用となり、他のモデルには使えなくなってしまう。
一方、接線空間で法線を記録する場合は、相対的な方向ベクトルとなるため、
すべてのモデルに再利用可能となる。
2. 圧縮と利便性
接線空間では、法線ベクトルはすでに正規化されており、
3つの座標成分はいずれも [0, 1] の範囲内に収まる。
また、ベクトルの長さが1に固定されているため、
2つの成分があればもう1つの成分を導出可能で、データ圧縮やシェーダ処理に有利。
② ワールド空間と接線空間の変換
ライティング計算を行う際、光の計算に用いるベクトルは共通の座標系で扱う必要がある。
そのため、接線空間で得た法線ベクトルをワールド空間に変換するための行列、
またはワールド空間のベクトルを接線空間に変換するための行列が必要になる。
処理手順:
- ワールド空間の頂点の法線(Normal)・接線(Tangent)・副接線(Bitangent) を使用し、この3つのベクトルからなる**直交基底(標準正規直交基)**で変換行列を構築する。
- これにより、法線 → Z軸、接線 → X軸、副接線 → Y軸 のように基準を定義する。
変換行列(TBN行列):
行列表記:


③ Unity におけるノーマルマップの圧縮形式
-
モバイル以外のプラットフォームでは、Unity はノーマルマップを DXRT5nm形式 に変換する。
この形式では、有効なチャンネルは GチャンネルとAチャンネル のみであり、
これによりメモリ使用量を削減できる。
DXRT5nm形式では、GとAにそれぞれ 法線のX成分とY成分 を格納し、
Z成分は簡単な計算式で復元される。 -
モバイルプラットフォームでは、Unity は従来通り RGBチャンネル を使用する。


法線マップをデコードする際に「*2-1」の操作を行うことについての説明
法線テクスチャには表面法線が格納されており、法線ベクトルの成分範囲は[-1,1]、ピクセル値の範囲は[0,1]であるため、通常以下のマッピングを行う:pixel = (normal + 1) / 2 デコード時にはこの逆操作を行う必要がある。
normal.xy *= scale; の説明
法線の摂動(ディストーション)効果をスケールするための操作。
【TA】Bump Mappingの紹介
1. 物体にディテールを与える方法
物体のディテールは大きく3つに分類できる:マクロ視点、ミドル視点、ミクロ視点
-
ミドル視点(中観):
-
ミクロ視点(微観):
2. バンプマッピング(BUMP)
中観スケールのディテールを模倣する代表的な手法の一つで、
モデルよりもさらに微細なディテールを視覚的に表現できる。
中心的な考え方:
-
テクスチャでスケールに関する情報をエンコードする
-
視覚的に照明を受けた表面の凹凸を、実際の凹凸表現に置き換える
-
表面に小スケールのディテールを持たせるように見せる
原理:
-
モデルの表面法線を画像によって変化させ、それを元にライティングを計算する
-
複雑なジオメトリを追加せずに、現実感のある視覚効果を実現する効率的な方法
-
法線マップなどを用いた例では、明暗のディテールが大幅に増加するのが確認できる

3. 分類(マッピング方式の比較)
|
Bump Mapping |
頂点の元の法線方向を直接使用するのではなく、法線方向に微小な摂動(擾乱)を加えて新しい法線を生成し、照明計算を行うことで凹凸感を表現。 No self-occlusion, No self-shadow, No silhouette(自己遮蔽・影・輪郭なし) |
1978 |
|
Displacement Mapping |
頂点の位置に直接作用し、対応する変位マップ(Displacement Map)の値に基づいて頂点を移動させ、実際の幾何的な凹凸面を生成。 | 1984 |
| Normal Mapping | 頂点の法線情報を直接必要とせず、法線方向はノーマルマップから取得。 RGBの各チャネルでXYZ方向の法線を表現し、照明計算に使用する。 No self-occlusion, No self-shadow, No silhouette |
1996 |
| Parallax Mapping Virtual Displacement Mapping(仮想変位マッピング) |
頂点位置は変更せず、視差によりheight mapを参照してテクスチャ座標を補正し、より立体的に見せる。 見かけ上、凹凸があるように見えるが、自己遮蔽・影・輪郭は表現できない。 |
2001 |
|
Relief Mapping Steep Parallax Mapping |
より高精度でリアルな視差と深度感を実現する手法。 Texture Offset を詳細に調整することで、self-occlusion, self-shadowing, view-motion parallax, silhouette のような表現も可能。 |
2005 |

【TA】照明モデル
一、定義
照明モデルは、物体のある点における光の強さ(色)を計算するために用いられる。
光と物体表面の相互作用として理解することができる。
計算理論に基づいて、次の2種類に分類できる:
◦ 物理理論に基づく照明モデル:物理を重視し、結果はリアルだが、計算が複雑である
◦ 経験モデル:実験結果に基づき、簡略化を行い、効果もなかなか良い
-
1967 第一次光照効果
-
1970 Lambert拡散反射モデル
-
1971 Gouraudモデル
-
1975 Phong照明モデル
-
1977 Blinn-Phongモデルの改良
-
1980 Whitted光線追跡モデル
-
1982 Cook-Torranceモデル
-
1986 Kajiyaが照明モデルを統一し、レンダリング方程式を開発
二、局所照明モデル
局所照明モデルの定義
局所照明モデルは、直接照明のみを対象とし、複数回の反射による光線は考慮しない。

局所照明モデルの分類
◦ 拡散反射
◦ 鏡面反射
◦ 環境光
◦ 自己発光
1. 拡散反射
定義:
全方向に分散して反射される光
拡散反射では、光線は吸収と反射を伴い、吸収によって色が変わり、反射によって方向が変わる。
計算: 一般的に Lambert モデルを用いて照明を計算する。
理論的基礎:
光学では、通常、放射照度を用いて光を定量化する。
その中で、光源が放つ全ての光量は放射束 。
特定面に照射された光の量は単位面積あたりの照度(照度)で表され、。
-
点光源が面 に垂直に照射された場合、照度
-
同じ光を別の傾いた面 に照射した場合、照度
よって、以下の関係式が得られる:

簡単に言えば:反射光の強さは、表面法線ベクトルと光源方向との間の余弦の比に比例する。

照明の公式:
![]()
拡散反射の効果は観察者の位置には無関係であり、光源の位置に依存する。

Lambert モデルは高品質な光効果を提供できず、作成されたマテリアルはゴムっぽく見える傾向がある。
2. 鏡面反射(スペキュラ反射)
定義:
鏡面反射とは、光線が物体表面に当たって生じる反射のこと。
光の強さは変わらず、方向が変わる。
何が鏡面反射か:
当観察者が反射光線の方向に近い位置から物体を見ると、鏡面反射を観察することができる。
鏡面反射とは、光が物体表面で反射される際に発生する現象である(光の強さは変わらず、方向のみ変化)。
鏡面反射の効果は、観察者の位置と反射方向の一致度によって決定される。
通常は視線方向と反射ベクトルとの一致度に基づいて反射強度を計算し、
ハイライトの大きさは視差(視線ベクトルと反射ベクトルの角度差)によって決まる。
どうやって計算するか?

- :材質の光沢度
-
:材質の反射率
-
:反射光ベクトル
-
:視線ベクトル
エネルギー分布図:

-
光沢度が小さい → ハイライト範囲が広い
-
光沢度が大きい → ハイライト範囲が狭い
3. 環境光(アンビエントライト)
定義:
間接照明の影響を考慮し、物体が直接照らされていない部分にもある程度の明るさが必要とされる
どうやって計算する?
このモデルでは、シーン内で多重散乱や反射が発生し、
すべての方向から均等に目標物体に放射されると仮定している。C_{\text{ambient}} = \text{Albedo} \times \text{Ambient}_{\text{light}}環境光による反射光量は、通常、拡散反射の反射率を使って示される。
このモデルでは、シーン内で多重散乱や反射が発生し、
すべての方向から均等に目標物体に放射されると仮定している。
4. 自己発光(エミッシブ)
定義:
物体が自ら発する光であり、単独で加算される。
【TA】モデルとマテリアルの基礎
一、レンダリングパイプラインとモデルの基礎
1.レンダリングパイプライン
おなじみの内容なので、講義のスクリーンショットをそのまま貼ります。

- 青い背景:プログラマブルパイプライン
- 頂点シェーダー:モデルの頂点を計算する
- フラグメントシェーダー:ラスタライズ段階で補間された情報を計算する
- 例:ライティング計算
2.uv
- テクスチャマッピング:すべての3Dオブジェクトの表面は2Dである → テクスチャは1枚の画像 → テクスチャマッピングとは、この画像を3Dオブジェクトにかぶせること
- uvとは、この画像をu軸とv軸のある座標系上に展開すること
- 各頂点はuv座標を使って、テクスチャに保存された情報を取得できる
3.モデルに含まれる情報
- v:頂点座標データ(モデル空間における1つの頂点のxyz座標)
- vt(texcoord):テクスチャ座標(uv座標)
- vn(normal):頂点法線
- 頂点カラー
二、マテリアルの基礎
- 光が四方八方に反射する。
- 補足:(GAMES101)入射するRadiance(放射輝度)は均一である → 入射と出射のIrradiance(照度)は等しい、かつそれぞれのRadianceも均一 → 入射Radianceと出射Radianceは等しい
- Lambertモデルはすべての方向に対して均一であると単純に仮定している。
2.鏡面反射
滑らかな鏡面反射


- 入射角と出射角が等しい。
- 入射光は表面法線に基づいて反射し、反射方向にのみエネルギーが存在し、それ以外の方向にはエネルギーが存在しない(すべて0)。
粗い鏡面反射(マイクロファセット反射)
法線のずれが小さいため、反射はある特定の範囲に集中し、マット(艶消し)のような質感になる。


3.屈折(リフラクション)
屈折
- 特殊な媒質では、反射に加えて屈折も発生する現象がある。
- 反射と屈折それぞれのエネルギー量はFresnelの法則によって決まる:
R = refract(View,Normal,ration);
ReflColor = tex2D(skybox,R);

6.マテリアル表面の変更
- 現実世界には完全に滑らかな表面は存在せず、モデルの頂点に含まれる法線情報も限られているため、
- 私たちはノーマルマップを使って効果を表現する。
ライティング計算では法線が関与するため、この法線を調整することでライティングの結果を変えることができる。 - 例えば『GUILTY GEAR(ギルティギア)』のトゥーンシェーディングでは、手動で法線を調整している。
- 補足:(GAMES101):レンダリング方程式において、マテリアルに関わる項はBRDFである。CGにおいて、Material = BRDF と考えられる。
【TA】色空間の紹介
色をどう表現するか
感覚的な認識ではなく、ここでは真面目に議論し、問題の本質を探ります ——> 色彩科学です。
色の送信者(光源の発射角度)
オブジェクト指向の考え方で理解すると:
出生点:光源
Object:光線。光源から発せられた光線が、直射・反射・屈折などの経路を経て最終的に人間の目に入ります。
人間の目が光線を受け取ると、目の細胞が一連の反応を起こし、最終的に脳に伝達されて認識されます。
→ //補足:色とは実は人間の「知覚」です。具体的にどうやって知覚されるか → 後述の「人間の感光細胞の分布」を参照。
光源
光を発する物体。(光の発生源)
光:物理現象の一種であり、認識・測定の指標としては「波長」や「エネルギー分布」があります。

- 理論的に言えば、光は無限に広がっていますが、私たちが見ることができる光の波長は限られています。
- 補足:どのような光であっても——必ずそれに対応する光のスペクトル(波長分布)があります。
可視光線の範囲:およそ 400~700nm -
400nm より左側:紫外線(UV)
-
700nm より右側:赤外線(IR)
-
太陽が最も明るく見える部分では、白色として認識されます。
エネルギー分布
光は波であり、実在する物理的な現象です。そのため、当然「エネルギー」も持っています。
例:ある種の光は、複数の波長が組み合わさって構成されています。
光のエネルギーの単位:焦耳(Joule)
では、色を表現する際に「波長」だけで説明すれば良いのでは?
→ 問題:それでは人間にとって直感的ではなく、理解しづらい。つまり、波長だけでは簡潔に色を表現することができず、人間の感覚に合いません。
そこで登場するのが:分光光度計
これは、光を波長ごとに分けて、その強度(エネルギー分布)を測定する装置です。
補足:波長が異なれば、屈折率も異なります。
これは光が異なる媒質を通過する際に曲がる程度(屈折率)が、波長によって変化するためです。

分光光度計
作用:
① 光を分解し、単一波長の光を生成する
② その単一波長の光の実際のエネルギーを測定する
これは、光の具体的なエネルギー強度を記述・分析するために用いられます。
「分光」操作を通じて、ある波長範囲の光を検出・測定し、
最終的に得られる**光のスペクトル(波長ごとのエネルギー分布)**では、
光のエネルギーが 550nm付近(緑色領域) に集中していることが分かります。

色空間
色空間の定義
ある色空間を定義するためには、少なくとも以下の3つの重要な要素を満たす必要があります:
① 色域(Gamut):三原色(RGB)の座標。
→ この3点を結ぶことで、色域の三角形を形成します。
② ガンマ補正(Gamma):
→ 三角形の内部に対して、白色点(ホワイトポイント)に向かって非線形な分割を行います。
→ これは人間の視覚特性に合わせた補正であり、計算の効率化にも役立ちます。

詳解:色彩空間における Gamma(ガンマ)
- Gamma は色空間そのものではなく、「色をどのようにサンプリング(分布)するか」を定義する方式です。
-
Gamma = 1:
→ 均等に切り分ける、つまり線形(リニア)な分布。 -
Gamma ≠ 1:
→ 非線形な分布(人間の視覚特性に基づく)。
→ 暗部に対して高い感度を持ち、明部に対しては鈍感。
→ 人間の目は「暗い部分を細かく観察」し、「明るい部分をざっくり観察」する傾向があるため、非線形なガンマカーブが使われます。 - これは、初期のコンピュータのハードウェア制限にも関係しており、
より効率的にデータを扱うためにも導入されていました。
(※詳細は「Gamma 補正」の講義を参照)

















