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
© Copyright 2024 ExpyDoc