本日は3Dグラフィック枠です。
3DCGを描画する際にはOpenGL、DirectXなど様々なグラフィックスAPIが用いられ、レンダリングが行われています。
グラフィックスAPIによって若干のデータの扱いの違いがあります。
例えばMetalではそもそもジオメトリシェーダーステージをサポートしていませんし、以前筆者が陥った例だと、Androidで広く使用されているOpenGLとDirectXではUVの基準点が異なります。(DirectXでは左上が原点、OpenGLでは左下が原点)
今回はノーマルマップの違いについてみていきます。
〇ノーマルマップでの形式
ノーマルマップには、OpenGL形式とDirectX形式の2つの主要な形式が存在します。
例えばSubstancePainterで新規プロジェクトを作成する場合は法線マップのモードとしてOpenGL、DirectXのタイプが選択可能です。

使用するソフトウェアに合わせ適切に法線マップのタイプを選択する必要がありますが、この違いはDirectXとOpenGLで座標系が異なるための違いです。
具体的にはDirectXでは座標系が左手系、OpenGLでは右手系です。
ノーマルマップのRGBチャンネルのうちGチャンネルが異なっています。
この違いによって同一のノーマルマップでDirectX、OpenGLではでこぼこが反転して見えます。
これによってテクスチャの見え方が異なってしまうことが2種類の形式がある理由です。
〇ソフトウェアによる違い
多くのソフトウェアではOpenGL形式、DirectX形式の両方に対応しています。
| カテゴリ | ソフトウェア名 | DirectX系 | OpenGL系 |
|---|---|---|---|
| ゲームエンジン | |||
| Unity | ◯ | ||
| Unreal Engine | ◯ | ||
| GameMaker Studio | ◯ | ◯ | |
| Godot Engine | ◯ | ◯ | |
| Defold | ◯ | ◯ | |
| PICO-8 | ◯ | ◯ | |
| Pyxel | ◯ | ◯ | |
| Cocos2d-x | ◯ | ◯ | |
| DCCツール | |||
| Maya | ◯ | ◯※ArnoldはOpenGL | |
| Blender | ◯ | ||
| Zbrush | ◯ | ◯ | |
| 3dsMax | ◯ | ||
| Lightwave | ◯ | ◯ | |
| Houdini | ◯ | ◯ |
〇DirectX系とOpenGL形式の変換
前述のとおり両者の違いはG成分の向きの違いです。
つまりIntensityの値を-値で反転させることででこぼこが反転し両方に対応させることができます。