MEMO2018-07-25ノーマルマップに関して覚書ノーマルマップを自前で実装する際に学んだことをメモ。前提として、右手系で考える。OpenGLとDirectXで法線マップ画像が異なる理由OpenGL用では緑が強いほど上方向へ傾いているがDirectX用では下方向に傾いており、Y軸に関して逆になっている。これは、OpenGLが右手系、DirectXが左手系と座標系が異なる事に起因している。テクスチャに対して、手前をZ軸正方向、右をX軸正方向とすると、Y軸正方向は右手系と左手系とでどうしても逆になってしまう。そのため、OpenGLとDirectXで法線マップ画像が異なっている。法線マップは接空間上のベクトルを表現している。そのため右手系において、頂点に対して頂点法線をZ軸、UV座標のV軸正方向をY軸、U軸正方向をX軸とする接空間を考える。接空間のZ軸をNormal、Y軸をBinormal、X軸をTangentと定義する。外積によるTangent、Binormalの計算2ベクトルの外積は、その2ベクトルが成す面に対して垂直なベクトルである。そのため、説明記事によっては以下の方法でTangent/Binormalを算出出来ると書いているものがある。t);しかし、外積は同じ向きor逆方向の場合に結果が0ベクトルとなってしまう。0.0)の時等で結果がおかしくなってしまう。この方法だとTangentやBinormalがUV座標のU軸/V軸と一致している保証がない。1)となるようなUVマップのように、ローカル座標Y軸負方向に行くほどVが大きくなるようなUVマップもありえる。UV座標のU軸がTangent、V軸がBinormalと対応していると定義しているのに、そのTangent/Binormalの算出にUV情報を用いないためこの方法では正確な法線情報が算出出来ない。参考:チュートリアル13:法線マッピング各三角面毎に頂点のTangent/Binormalを、頂点座標とUV座標の変化を元に算出する方法。三角ポリゴンの頂点v0,v1,v2において、v0のTangent/Binormalは以下の式で算出出来る。r;この計算式を利用して、モデルの頂点座標/UVデータを元に算出しシェーダーへuniformとして送る。ローカル空間における法線情報の算出ローカル空間におけるNormal/Tangent/Binormalがあれば、以下の式でローカル空間における法線情報を導く事が出来る。sampleNormal.y)というように、Yに関して反転させているのは、テクスチャはUV座標系において上下反転するから。0から学ぶ法線マップチュートリアル13:法線マッピング。