HWAnisotropicLight_J

Hardware Accelerated
Anisotropic Lighting
Mark J. Kilgard
NVIDIA Corporation
Original: http://developer.nvidia.com/attach/6820
日本語訳:memoblog
このアイデアのクレジット
• Wolfgang HeirdrichとHans-Peter Seidel
– University of Erlangen, Germany
• 彼らはMalte Zockler, Detlev Stalling, そしてHansChristian Hegeらによって開発された技術からイン
スパイアを得ました。
• 現実感のあるレンダリングのためのトリックに変化
する科学的な可視化技術です。
2
異方性のある表面
• 以下の表面に共通する特徴は何でしょうか?
– 光沢のある服
– クリスマスツリーのボール(糸に覆われた装飾品)
– CD
– 磨いた金属
–髪
• 答え:これらは全て異方性の光源特性を示します。
3
”Normal”表面
• 伝統的な光源モデルは、3D表面が局所的には平面
とみなしています。
• 表面上の点の法線ベクトルは、平面に直交します。
• 表面の接線は、均一に分配されていると暗黙的に
みなしています(等方分配)。
• バンプ・マッピングのような効果は、表面の法線を乱
していますが、表面の土台は局所的に平面としてモ
デル化したままです。
4
布目をもった表面がある
• 織った光沢のある服は固有の布目を持っています
(局所的に、表面の接線方向に有利な計らいをしま
す)。
• 磨いた金属もです。
• 髪もです。
• CDやレコードの溝もです。
• クリスマスツリーの装飾品の光沢のある繊維もです。
• 独特な視覚効果について説明します!
5
何が異方性を作るのか?
• 異方性のある表面の鍵:
– 表面の擦り傷や繊維に沿った表面法線の分配は、
それらに交差した分配と異なります。
• 比較的距離がある観測者は、光源の結果を見るこ
とができますが、微細構造は見ることができません。
6
球上の反射光ハイライト
• p7~p13まで省略
7
一般的な局所光源モデル
• 表面上の点の明度:
Iout = Iambient + Idiffuse + Ispecular
ここで、
Iambient = ka  Ia
Idiffuse = Kd  < L·N >  Iin
Ispecular = Ks  pow(< V·R >, n)  Iin
8
記号のチートシート
Iin -- 光源から入ってくる明るさ
Ka -- 環境光(ambient)の色
Kd -- 拡散反射光(diffuse)の色
Ks -- 鏡面反射光(specular)の色
9
記号のチートシート (2)
< L·N > -- (正規化された)光源へのベクトル
と表面の法線ベクトルとの内積
< V·R > -- (正規化された)視点へのベクト
ルと反射ベクトルの内積
pow(x, y) -- xのy乗
n -- 輝度(shininess)
10
繊維の光源
• 糸や髪はどのように光らせたいですか?
• これらには伝統的な表面法線がありません!
• 論理的には、糸上のそれぞれの点は、その点の接線
に垂直な法線の無限の“円”を持ちます。
11
繊維のための法線
横から見た図:
法線の候補
この点での接線
上から見た図:
法線の候補による
無限の円
接線はこのページの外に向かっています!
12
どこでも法線、法線!
• たくさんの法線が拾えてしまいます!
• 光源計算のためにどの法線を使うべきでしょうか?
• 案として、全ての法線の貢献を積分することが挙げ
られます。
• とても大変なので、最も重要な法線を選んで、それ
を使用することにします。
• (最も重要な法線の貢献は、全ての貢献よりはまだ
小さいです。)
13
最も重要な法線
• 光源へのベクトルと、視点へのベクトルからなる平
面上にある法線を選びます。
• このベクトルは、光源の内積を最大にするでしょう
(そしてそれが最も重要なベクトルです)。
14
数学はクールです
• 明確に最も重要な法線(N)を定義しなくても、<L・N
>と<V・R>は、L、T、Vから計算することができま
す。
• 覚えておいてください:
L -- 糸上の点から光源へのベクトル
T -- 糸上の点の接線ベクトル
V -- 糸上の点から視点へのベクトル
15
クールな数学
<L・N>=sqrt(1-(<L・T>)^2)
<V・R>=sqrt(1-(<L・T>^2)×
sqrt(1-(<V・T>)^2)<L・T>×<V・T>
クールな所見:
<L・N>と<V・R>は、<L・T>と<V・T>の
二変数の関数として定義することができます。
16
ハードウェアでできること…
• 2つの内積<L・T>と<V・T>を計算します。
• (注意:固定視点&平行光源を仮定しているため、Vと
Lベクトルは一定ですが、Tは頂点ごとに変化します。)
• 次に、2つの内積に基づく任意の関数を計算します。
OpenGLはこれができると信じられるでしょうか!
17
OpenGLはこれをサポートしています!
• OpenGL4x4のテクスチャ行列が4つの内積を計算
します(私たちには2つだけ必要です)。
– テクスチャ行列の列を定数ベクトルとして扱います
– テクスチャ座標系が接線ベクトルになるようにします(頂
点ごとに変化)。
• OpenGLは2Dテクスチャマップとして参照することで、
任意の二変数関数もサポートします。
• テクスチャ行列の出力が、二変数関数の入力であ
ることに注意してください!
18
テクスチャ行列の設定




 Lx Ly Lz 1 Tx   1 2 L  T  1

Vx Vy Vz 1 Ty   1
1 
     2 V  T  1

2 0
0 0 0 Tz  
0


  
0 0 2  1  

1
0
• 列はLとVベクトルを含みます。
• [-1,1]の内積空間から[0,1]のテクスチャ空間にスケ
ールとバイアスも行います。
19
2次元テクスチャの事前計算
• 2次元テーブルとして働くテクスチャの計算
Iout = Iambient + Idiffuse + Ispecular
= Ka  Ia +
Kd  < L·N >  Iin +
Ks  pow(< V·R >, n)  Iin
• 変化するパラメータは、上の式の< L·N >と<
V·R >です(二変数)。
20
明るさ
• 最も重要な法線を使っており、全ての異方性
のある表面の全体の光を計算しているわけ
ではないので、拡散光と鏡面光は2~4乗
(倍?)して強めたほうが望ましいかもしれま
せん。
21
2次元テクスチャの例
< V ·R >
軸
< L ·N > 軸
22
異方性のレンダリング
• 異方性のある表面をレンダリングするとき
– <L・N>と<V・R>の関数として光源モデルをエ
ンコードした2Dテクスチャを有効にする
– 説明したようにテクスチャ行列を設定
– glTexCoord3f(Tx, Ty, Tz)を使用して、テクスチャ
座標系として表面または繊維の頂点毎の接線ベ
クトルを渡す
• 結果:異方性のある光源!
23
警告
• もし接線ベクトルを視点空間に変換する必要がある
のであれば、glMultMatrixでテクスチャ行列にモデ
ルビュー行列の逆転置行列を連結してください。
• 接線ベクトルは単位ベクトルのみを送るようにしてく
ださい(接線ベクトルテクスチャ座標系を単位ベクト
ル化するglEnable(GL_NORMALIZE)と同等のも
のはありません)。
• 頂点毎の光源アーティファクトが適用されます。
24
セルフシャドウ
• p31~37まではまた後日
25