OpenGL ES 2.0 プログラムで modelViewTransformation Matrix に恒等行列を使用しているとします。この場合の座標系は、(-1,-1,-1) から (1,1,1) に拡張される正規の OpenGL 座標系です。
この座標系は右利きですか、それとも左利きですか?
より広い質問: API が従うすべての数学的規則を一覧表示できる OpenGL のドキュメントはありますか?
OpenGL ES 2.0 プログラムで modelViewTransformation Matrix に恒等行列を使用しているとします。この場合の座標系は、(-1,-1,-1) から (1,1,1) に拡張される正規の OpenGL 座標系です。
この座標系は右利きですか、それとも左利きですか?
より広い質問: API が従うすべての数学的規則を一覧表示できる OpenGL のドキュメントはありますか?
ALWAYS REMEMBER!! OPENGL ONLY KNOWS NDC ,AND IT IS LEFT_HANDED!
固定パイプラインでは、glOrtho(...)、glFrustrum(..) のように固定関数が右利きであるため、幻想 openGL は右利きです。
OpenGL は、中間行列プロセスに使用する手座標系を気にしません。それをNDCにミラーリングする限り、必要に応じて軸座標系を使用できます。
カメラを忘れてください!
私たちの画面は 2D 平面だからです。これを想像してみてください。あなたのビューポートは黄色いゴムの平面です。これらの 4 つの角を NDC に突き合わせます。このようなもの:
NDC のすべての頂点は、-z 軸に沿って黄色のラバー プレーンにヒットします。これが実際の画面に表示されます。
正規化されたビュー ボリューム (正規化されたデバイス座標) は左手です。これは、単位行列を渡して2つの三角形を描くことで簡単にテストできます
float points[] = { -1, 1, -0.5,
-1, -1, -0.5,
1, -1, -0.5,
1, 1, 0.5,
-1, -1, 0.5,
1, -1, 0.5 };
結果を見る(glEnable(GL_DEPTH_TEST)を使用)
したがって、頂点シェーダーは次のようになります。
uniform mat4 mvp_mat;
// Incoming per vertex... position (fills in 1 for w if from vec3 buf)
layout (location = 0) in vec4 v_vertex;
void main(void)
{
// multiplying by identity doesn't transform the geometry
gl_Position = mvp_mat * v_vertex;
}
または、単位行列は何もしないので、このようにもっと簡単にテストすることもできます
layout (location = 0) in vec4 v_vertex;
void main(void)
{
//no transformation, no confusion, just straight to OpenGL
gl_Position = v_vertex;
}
明らかに、三角形の色を変えて、それらがどのように重なり合っているかを確認する必要があります。
この投稿と私のコメント/質問も参照してください: plus.google.com/114825651948330685771/posts/AmnfvYssvSe
誤った情報がインターネット全体や教科書のどこから来るのか、私にはわかりません。OpenGL は、前面を決定するための三角形の巻きについて話している場合、デフォルトで右利きのみです (デフォルトで CCW = 右利き)。ワールド スペース、オブジェクト スペース、アイ スペースは OpenGL には存在せず、グラフィックス プログラマだけに存在します。OpenGL は単にポイントを取得し、正規のビュー ボリューム [-1, -1, -1] x [1, 1, 1] の外側にあるものをすべてクリップし、それらをデフォルトで [0, w) x [ であるスクリーン空間/ウィンドウ座標に変換します。 0, h) x [0, 1]. 深度テストが有効になっている場合、デフォルトの動作は左利きで、下を向く +z です。
OpenGL が左利きであることを説明するには、いくつかの方法があります。ほとんどの人はそれを行列で処理します (彼らは気づいていませんが)。glDepthFunc を使用して GL_GREATER に設定することもできると思います。
http://www.opengl.org/sdk/docs/man3/xhtml/glDepthFunc.xml
左利きであることのさらなる証拠はここにあり ます http://www.opengl.org/sdk/docs/man3/xhtml/glDepthRange.xml
「クリッピングと w による除算の後、深さ座標の範囲は -1 から 1 で、クリッピング面の近くと遠くに対応します」つまり、正の z が画面に入ります = 左利きです。DepthRange を使用して、右利きの動作に変更することもできます。
編集: 私が間違っているという Bob Cross の主張に応えて、私が正しいことを示す単一のソース ファイル プログラムを以下に示します。https://github.com/rswinkle/opengl_reference/blob/master/src/left_handed.c
README https://github.com/rswinkle/opengl_referenceでスクリーンショットを確認できます。
OpenGL ES 座標系は、(-1, -1, -1) から (1,1,1) までの正準体積を含む右手系です。これをコードで確認しました。