ビューイングパイプライン

全体の流れ

座標系の名前 説明 変換行列の名前
ローカル座標系 モデルの中心が原点になるような座標系
モデル変換行列…glTranslate,glRotate等
ワールド座標系 世界の基準となるように設けられた一つの座標系。glLoadIdentity()した時になるのがワールド座標系だと思う。
ビュー変換行列….gluLookAt()
カメラ座標系 原点が視点の座標系。z軸:視線の方向(前方方向)がz軸の負の方向である。
投影変換行列…glMatrixMode(GL_PROJECTION);
クリップ座標系 透視投影だったら、視錐台の形をしている。正投影だったら、長方形の形をしている。
wで割る(自動) zの正負逆にする
正規化デバイス座標系 範囲が$-1 \leq x \leq 1, -1 \leq y \leq 1, -1 \leq z \leq 1$の座標
ビューポート変換行列…glViewPort(0,0,width,height);
ウィンドウ座標系 左上が原点で右下が(width,height)座標系

考え方の順番としては上の表の、上から下だけど、
実際にコードを書くときは、下から上の順になる。

正投影でお手軽座標変換

三角形がY軸中心に回るだけのコードです


カメラ座標系から正規化デバイス座標系まで一気に変換してしまいます。
glOrtho(-1.0,1.0,-1.0,1.0,-1.0,1.0);
したのと同じ効果になります。

    //triangle verts
    vec4 a=vec4(0.0,1.0,0.0,1.0);
    vec4 b=vec4(-1.0,-1.0,0.0,1.0);
    vec4 c=vec4(1.0,-1.0,0.0,1.0);
    mat4 mv = translate(0.0,0.0,-2.0)*rotate( 0.0,sin(iGlobalTime),0.0);
    //convert to camera coordinate
    vec4 viewa = mv*a;
    vec4 viewb = mv*b;
    vec4 viewc = mv*c;
    //ビュー座標から正規化デバイス座標(normalized device coordinate)へ変換
    vec2 ndca = -viewa.xy/viewa.z;
    vec2 ndcb = -viewb.xy/viewb.z;
    vec2 ndcc = -viewc.xy/viewc.z;

フルソースコード(ShaderToy)

camera coordinate matrix orthogonal-projection pipeline projection rendering-pipeline unproject viewport-matrix

サポートサイト Wikidot.com cameracoordinatematrixorthogonal-projectionpipelineprojectionrendering-pipelineunprojectviewport-matrix