ユーザ用ツール

サイト用ツール


opengl:lefthand

差分

このページの2つのバージョン間の差分を表示します。

この比較画面へのリンク

両方とも前のリビジョン前のリビジョン
次のリビジョン
前のリビジョン
opengl:lefthand [2014/04/16 00:14] – [Screen 座標系] ogaopengl: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         ^ OpenGL           Programmable   ^                                        ^ +^                       ^ Direct3D         ^ OpenGL           座標系の変更   ^                                        ^ 
-^ 3D 座標系             | LH 左手系        | RH 右手系        | API 依存なし   | Cライブラリと Shader が自由に決定可能 +^ 3D 座標系             | LH 左手系        | RH 右手系        | 可能           | Cライブラリと Shader が自由に決定可能 
-^ Clip (device) 座標系 1.0 >= >= 0.0  1.0 >= >= -1.0 | API 依存あり   | Driver 内部に組み込まれているため Shader で変換が必要  |+^ Clip (device) 座標系  | Z/w: 0.0 ~ 1.0  Z/w: -1.0 ~ 1.0 | API 依存あり   | Driver 内部に組み込まれているため Shader で変換が必要  |
 ^ Screen 座標系         | 左上原点         | 左下原点         | API 依存あり   | API で決められているため、呼び出し時に変換が必要。Viewport/Scissor 等  | ^ Screen 座標系         | 左上原点         | 左下原点         | API 依存あり   | API で決められているため、呼び出し時に変換が必要。Viewport/Scissor 等  |
-^ UV 座標系             | 左上原点         | 左下原点         API 依存なし   | 自由に決定可能。データは上下が反転しているが API 上は違いがない。   | +^ UV 座標系             | 左上原点         | 左下原点         可能           | 自由に決定可能。データは上下が反転しているが API 上は違いがない。   | 
-^ Tangent Space 座標系  | 未定義(右手系)   | 未定義(右手系)   API 依存なし   | テクスチャデータと Shader で好きな様に定義できるが、RH のデータが多い  |+^ Tangent 座標系        | 未定義(右手系)   | 未定義(右手系)   可能           | テクスチャデータと Shader で好きな様に定義できるが、RH のデータが多い  |
  
  
行 63: 行 64:
  
 座標だけでなく Animation の回転も Z 成分が逆になります。 座標だけでなく Animation の回転も Z 成分が逆になります。
- 
  
  
行 75: 行 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 を変換する場合は下記のようなります。
行 108: 行 112:
 </code> </code>
  
-またこの変換は、OpenGL で Shadow map を用いる場合にも必要になります。 +同様の変換は、OpenGL で Shadow map を用いる場合にも行っていることになります。 
-Shadow Map sampling 時は Z 範囲が 0~1.0 になるためです+Depth Map sampling 時は Z 範囲が 0~1.0 になるため。
  
 Shader 側で調整する場合は、Projection Matrix の相互変換は不要です。 Shader 側で調整する場合は、Projection Matrix の相互変換は不要です。
行 138: 行 142:
 API 上は制限がなく、あくまでデータがどちらのルールで作られているか次第になります。 API 上は制限がなく、あくまでデータがどちらのルールで作られているか次第になります。
  
-D3D と OpenGL では原点位置が異なりますが、外部で作られたデータを用いる場合はプログラム的には特に何も手を加える必要ありません。+D3D と OpenGL では原点位置が異なりますが、外部で作られたデータを用いる場合はプログラム的には特に手を加える必要ありません。
  
   * D3D : v 原点を上とみなす。メモリには 上から下に向かって画像が格納されているとみなす。   * D3D : v 原点を上とみなす。メモリには 上から下に向かって画像が格納されているとみなす。
行 147: 行 151:
  
  
-ただし、動的に Rendering して生成した Texture の場合は GL と D3D は上下反転しているので要注意。 +ただし、動的に Rendering して生成した Texture の場合は GL と D3D は上下反転しているので要注意です。 
-次の Screen 座標系とも関係しますが、Viewport や Scissor 、Framebuffer は左下原点とみなしてレンダリングが行われるからです+次の Screen 座標系とも関係しますが、Viewport や Scissor 、Framebuffer は左下原点とみなしてレンダリングが行われるため
  
  
 ===== Screen 座標系 ===== ===== Screen 座標系 =====
  
-OpenGL API は左下原点とみなします。 +OpenGL の Framebuffer (Renderbuffer) は左下原点とみなします。 
-例えば Viewport や Scissor 範囲の設定がこれに相当します。 +関連する API 郡、例えば Viewport や Scissor 範囲の設定も左下原点です。 
-固定機能なので、残念ながら自由に座標系を決めることができません。+固定機能なので自由に座標系を決めることができません。 
 + 
 +また Texture へのレンダリングを行った場合も左下原点とみなすため、 
 +生成されたイメージは Direct3D とは上下逆の画像になります。 
 + 
 + 
 + 
 + 
 + 
 + 
 +===== Tangent 座標系 (Normal Map 座標系) ===== 
 + 
 + 
 +Normal Map の座標系は、生成に使用したツールに依存する場合がほとんどです。 
 +多くの DCC ツールが OpenGL を用いているため、 
 +ObjectSpace の Normal Map であっても右手座標系 (RH) が用いられている場合が多くなります
  
-RenderBuffer の内容も D3D と OpenGL で異なりま。 +よって Direct3D でも Normal Map だけ RH が用いられるこが少くありません。 
-OpenGL 左下原点格納されるためD3D とちょうど上下逆イメージが生成され+符号反転は Shader 内低コストに実現できるため、Normal Map 座標系の違いはあり問題になりませんでした
  
 +また Normal Map はデータ圧縮のため、地形データなどは Tangent Space でリピートやミラーを併用する場合があります。
 +そもそもこの場合の座標系は Polygon Face 毎に異なっており一定ではありません。
  
 +Matrix (Normal, Binormal, Tangent) で表現する場合は座標系の自由度が高いこと、
 +API と関係なく Shader 内部の事情にすぎないことから、特に問題なく相互利用が可能となります。
 +なお、Quaternion が用いられている場合は軸(座標系)が固定になるので要注意。
  
-===== Tangent 座標系 ===== 
  
  
  
opengl/lefthand.1397574862.txt.gz · 最終更新: 2014/04/16 00:14 by oga

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki