2010-11-21 18 views
2

レッドブックでリシェイプの例を見ると、私は通常のようなものを見つける:私はglLoadIdentity();によってglMatrixMode(GL_PROJECTION);が続い呼び出すと、射影行列がリセットされますが、glMatrixMode(GL_MODELVIEW)は通常時と呼ばれる理由私は理解していないことを理解しなぜ、リシェイプコードはglMatrixMode(GL_MODELVIEW)で終了するのですか?

void reshape(int w, int h) 
{ 

    glViewport(0, 0, (GLsizei) w, (GLsizei) h); 
    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
    glFrustum(-1.0, 1.0, -1.0, 1.0, 1.5, 20.0); 
    glMatrixMode(GL_MODELVIEW); 

} 

を形の終わり。

この特定の例では、glFrustumは投影行列に影響します。 GL_MODELVIEWは後で呼び出されるのはなぜですか? glMatrixMode(GL_MODELVIEW)への最後の呼び出しが省略されている場合は違いがありますか?

答えて

3

レンダリングコードのほとんどは、オブジェクトの移動やカメラの位置に影響するため、GL_MODELVIEWに影響します。ただし、サイズ変更コードはGL_PROJECTIONで動作します。プログラマはおそらく、現在の行列がコードの大部分のmodelviewであると仮定し、別のものが影響を受ける必要があるときは、行列を変更して更新し、ターゲットをGL_MODELVIEWに変更します。コードは間違った行列をターゲットにしません。

一般に、OpenGL関数は現在ターゲットとされているマトリックスに影響を与えます。なぜなら、マトリックスを変更する理由です。

+0

glMatrixMode(GL_MODELVIEW)の最後の呼び出しが省略されている場合は違いがありますか? – andandandand

+4

はい - 他の場所に置かない限り。基本的には、行列演算のほとんどはmodelview行列で行われます(投影行列はウィンドウのサイズ変更ごとに1回のみ実行されます)。そのため、モデルビュー行列スタックをアクティブな行列スタックにする必要があります行列呼び出し)。だからこそ、「他の行列スタックを変更してから、それをオンにし、あなたのものを行い、modelviewに戻す」傾向があります。 – Kos

関連する問題