opengl:lefthand
差分
このページの2つのバージョン間の差分を表示します。
両方とも前のリビジョン前のリビジョン次のリビジョン | 前のリビジョン | ||
opengl:lefthand [2014/04/16 00:24] – [3D 座標系] oga | opengl:lefthand [2014/04/16 17:57] (現在) – [OpenGL で Direct3D 座標系を使う (またはその逆)] oga | ||
---|---|---|---|
行 23: | 行 23: | ||
* DCC ツールの座標系に合わせて開発できる (GL座標系が多いし Z-Up のものもある) | * DCC ツールの座標系に合わせて開発できる (GL座標系が多いし Z-Up のものもある) | ||
- | * 必要なこと | + | * 必要なことと問題点 |
* 数値演算系のライブラリやシェーダーコードは独自に用意する必要がある。 | * 数値演算系のライブラリやシェーダーコードは独自に用意する必要がある。 | ||
- | * サンプルのコードをそのまま流用できない。 | + | * サンプルのコードはそのまま流用できない。 |
- | + | * Clip 座標系と Screen 座標系の扱いは完全に置き換えられない。 | |
+ | |||
+ | GPU ハードウエア的には両 API に対応するのが当たり前なので、一部の GPU を除いてどちらでも問題ありません。 | ||
===== OpenGL と Direct3D の座標系の違い ===== | ===== OpenGL と Direct3D の座標系の違い ===== | ||
- | ^ ^ Direct3D | + | ^ ^ Direct3D |
- | ^ 3D 座標系 | + | ^ 3D 座標系 |
- | ^ Clip (device) 座標系 | + | ^ Clip (device) 座標系 |
^ Screen 座標系 | ^ Screen 座標系 | ||
- | ^ UV 座標系 | + | ^ UV 座標系 |
- | ^ Tangent 座標系 | + | ^ Tangent 座標系 |
行 74: | 行 75: | ||
Vertex Shader の出力が Clip 座標系になります。 | Vertex Shader の出力が Clip 座標系になります。 | ||
上の表は w 除算後のもので、実際は -w~w を出力します。 | 上の表は w 除算後のもので、実際は -w~w を出力します。 | ||
+ | |||
+ | OpenGL は x/w, y/w, z/w が対称になるため、LSPSM のような Projection 方向の入れ替えがわかりやすくなります。 | ||
+ | Direct3D はよりハードウエアに近い値を取ります。 | ||
+ | |||
z の範囲が異なるため、Direct3D と OpenGL では Projection Matrix に互換性がありません。 | z の範囲が異なるため、Direct3D と OpenGL では Projection Matrix に互換性がありません。 | ||
- | プラットフォーム依存をナクするためには、Projection Matrix を事前に変換するか、または Shader 内で座標調整が必要です。 | + | プラットフォーム依存を回避するためには、Projection Matrix を事前に変換するか、または Shader 内で座標調整が必要です。 |
Projection Matrix を変換する場合は下記のようなります。 | Projection Matrix を変換する場合は下記のようなります。 | ||
行 107: | 行 112: | ||
</ | </ | ||
- | ↑またこの変換は、OpenGL で Shadow map を用いる場合にも必要になります。 | + | ↑同様の変換は、OpenGL で Shadow map を用いる場合にも行っていることになります。 |
- | Shadow | + | Depth Map sampling 時は Z 範囲が 0~1.0 になるため。 |
Shader 側で調整する場合は、Projection Matrix の相互変換は不要です。 | Shader 側で調整する場合は、Projection Matrix の相互変換は不要です。 | ||
行 137: | 行 142: | ||
API 上は制限がなく、あくまでデータがどちらのルールで作られているか次第になります。 | API 上は制限がなく、あくまでデータがどちらのルールで作られているか次第になります。 | ||
- | D3D と OpenGL では原点位置が異なりますが、外部で作られたデータを用いる場合はプログラム的には特に何も手を加える必要がありません。 | + | D3D と OpenGL では原点位置が異なりますが、外部で作られたデータを用いる場合はプログラム的には特に手を加える必要はありません。 |
* D3D : v 原点を上とみなす。メモリには 上から下に向かって画像が格納されているとみなす。 | * D3D : v 原点を上とみなす。メモリには 上から下に向かって画像が格納されているとみなす。 | ||
行 146: | 行 151: | ||
- | ただし、動的に Rendering して生成した Texture の場合は GL と D3D は上下反転しているので要注意。 | + | ただし、動的に Rendering して生成した Texture の場合は GL と D3D は上下反転しているので要注意です。 |
- | 次の Screen 座標系とも関係しますが、Viewport や Scissor 、Framebuffer は左下原点とみなしてレンダリングが行われるからです。 | + | 次の Screen 座標系とも関係しますが、Viewport や Scissor 、Framebuffer は左下原点とみなしてレンダリングが行われるため。 |
===== Screen 座標系 ===== | ===== Screen 座標系 ===== | ||
- | OpenGL | + | OpenGL |
- | 例えば Viewport や Scissor 範囲の設定がこれに相当します。 | + | 関連する API 郡、例えば Viewport や Scissor 範囲の設定も左下原点です。 |
- | 固定機能なので、残念ながら自由に座標系を決めることができません。 | + | 固定機能なので自由に座標系を決めることができません。 |
- | RenderBuffer | + | また Texture へのレンダリングを行った場合も左下原点とみなすため、 |
- | OpenGL は左下原点で格納されるために、D3D とちょうど上下逆のイメージが生成されます。 | + | 生成されたイメージは Direct3D |
- | ===== Tangent 座標系 ===== | + | |
+ | |||
+ | |||
+ | ===== Tangent 座標系 | ||
行 168: | 行 176: | ||
ObjectSpace の Normal Map であっても右手座標系 (RH) が用いられている場合が多くなります。 | ObjectSpace の Normal Map であっても右手座標系 (RH) が用いられている場合が多くなります。 | ||
- | そのため | + | よって |
- | 符号反転は Shader 内で低コストに実現できるため、Normal Map の座標系の違いはほとんど問題になりませんでした。 | + | 符号反転は Shader 内で低コストに実現できるため、Normal Map の座標系の違いはあまり問題になりませんでした。 |
- | また Normal Map はデータ圧縮のため、Tangent Space でリピートやミラーを併用する場合があります。 | + | また Normal Map はデータ圧縮のため、地形データなどは |
- | この場合の座標系は一定ではなくなります。 | + | そもそもこの場合の座標系は |
Matrix (Normal, Binormal, Tangent) で表現する場合は座標系の自由度が高いこと、 | Matrix (Normal, Binormal, Tangent) で表現する場合は座標系の自由度が高いこと、 | ||
- | API と関係なく Shader 内部の事情にすぎないことから、 | + | API と関係なく Shader 内部の事情にすぎないことから、特に問題なく相互利用が可能となります。 |
- | やはり特に問題にはなりません。 | + | なお、Quaternion が用いられている場合は軸(座標系)が固定になるので要注意。 |
opengl/lefthand.1397575443.txt.gz · 最終更新: 2014/04/16 00:24 by oga