tangent がないモデルに法線マップを貼る

キーポイント

tangent space 法線マップを貼る際には、法線マップを作ったときの接空間を頂点ごとに復元する必要があります。一般には DCC ツールからのエクスポート時やゲームエンジンへのインポート時に tangent を計算してモデルの頂点属性に tangent を追加することが多いですが、頂点属性に tangent を入れずにフラグメントシェーダーで tangent を動的に計算することで接空間を復元することもできます。

tangent 再計算のためのキーとなるのが GLSL の dFdx() / dFdy() 関数(HLSL では ddx() / ddy() 関数)です。tangent を計算するには UV 座標とピクセルの位置座標の偏微分が必要ですが、dFdx() / dFdy() を使えばそれが求められます。(ただし、この関数で計算できるのはスクリーン座標系での偏微分なので適宜座標系を変換する必要があります。)

詳細