最近FlashのStage3DというAPIがGPUでの3D描画に対応したらしいので、
勉強がてらに地球を表示してみました。
※FlashPlayer 11が必要ですThe Earth - wonderfl build flash online
Stage3DだとAGALという言語で直接シェーダープログラムを書くことができるんですね。
そこで今までやっていなかったバンプマッピングに挑戦してみました。
バンプマッピングというのは平面のポリゴンに擬似的に凹凸を貼り付けるものです。
凹凸の表現に使われるテクスチャには表面の高さを白黒で表したハイトマップ(左)や、
直接法線ベクトルを書き込んだノーマルマップ(右)が使われますが、
最終的にはどちらも内部で法線ベクトルに変換されます。

もちろん実際にシェーダーで使うためには、
法線ベクトルの向きをポリゴンに合わせて変換しなければなりません。
変換後の法線ベクトルR'は、変換前の法線ベクトルをR、
テクスチャが貼ってあるポリゴンのU座標(Tangent)とV座標(Binormal)の向きUV、
およびポリゴンの法線ベクトルNを使用して以下のように計算できます。
R'.x = U.x * R.x + V.x * R.y + N.x * R.z
R'.y = U.y * R.x + V.y * R.y + N.y * R.z
R'.z = U.z * R.x + V.z * R.y + N.z * R.z
U軸(Tangent)とV軸(Binormal)の求め方については複雑なので、ここでは割愛します。
自分はこちらやこちらを参考にさせていただきました。本当はこの計算を全て頂点シェーダ内でしてしまうと速いのですが、
今回は
手を抜いてフラグメントシェーダ内で行っています。
この辺を最適化すればもう少し速く動いたかもしれないです。
おまけ:絶賛作り直し中
スポンサーサイト