キーポイント
tangent space 法線マップを貼る際には、法線マップを作ったときの接空間を頂点ごとに復元する必要があります。一般には DCC ツールからのエクスポート時やゲームエンジンへのインポート時に tangent を計算してモデルの頂点属性に tangent を追加することが多いですが、頂点属性に tangent を入れずにフラグメントシェーダーで tangent を動的に計算することで接空間を復元することもできます。
tangent 再計算のためのキーとなるのが GLSL の dFdx() / dFdy() 関数(HLSL では ddx() / ddy() 関数)です。tangent を計算するには UV 座標とピクセルの位置座標の偏微分が必要ですが、dFdx() / dFdy() を使えばそれが求められます。(ただし、この関数で計算できるのはスクリーン座標系での偏微分なので適宜座標系を変換する必要があります。)
詳細
- チュートリアル13:法線マッピング
- 隣接頂点の uv, position から tangent を計算するための具体的な方法が書いてある
- MikkTSpace.com
- 法線マップを作るときによく使われているらしい実装
- Followup: Normal Mapping Without Precomputed Tangents | The Tenth Planet
- フラグメントシェーダーで tangent を計算する方法