1

私はコンピュータ グラフィックスを勉強してきましたが、ビューポート、gluortho の役割、および GL_MatrixMode と GL_Projection をいつ使用するかについて非常に混乱しています。これは私が書いたサンプルコードで、私を混乱させます。

void init()
{
    glClearColor(1.0,1.0,1.0,1.0);//Background Color of Viewport
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho(-200,200,-200,200,-50,50);
    glMatrixMode(GL_MODELVIEW);
}

void wheel()
{
    glClear(GL_COLOR_BUFFER_BIT);
    glColor3f(1,0.2,0.2);   
    glLoadIdentity();
    glViewport(0,0,200,200);
    glutSolidCube(100); 
    glFlush();
}
void main(int argc,char** argv)
{
    glutInit(&argc,argv);
    glutInitWindowSize(400,400);
    glutInitWindowPosition(400,400);//Position from the top left corner
    glutCreateWindow("Car");
    init();

    glutDisplayFunc(wheel);//Shape to draw
    glutMainLoop();
}

キューブのサイズを 200 に変更すると、キューブが消えます。なぜですか? それはzクリッピングよりも大きいからですか?glMatrixMode(GL_MODELVIEW) を削除すると、キューブが消えるのはなぜですか? 表示関数の最後にフラッシュしないと、立方体も消えてしまいます。なぜですか? ビューポートを小さくすると、オブジェクトが小さくなります。これは、オブジェクトの座標がワールド座標ではなく、ビューポートに対して相対的であることを意味しますか?

4

1 に答える 1

4

glOrtho立方体のサイズを 200 に変更すると、その面は、-50 と 50 への呼び出しで設定したニア クリッピング プレーンとファー クリッピング プレーンを超えて拡張されます。立方体の側面もファー クリッピング プレーンの外側にあるため、背面は見えません。

マトリックス モードを GL_MODELVIEW に設定するための呼び出しを削除すると、呼び出しglLoadIdentityが固定機能射影マトリックスで動作することを意味します (私はかなり確信しています)。そのため、キューブは正規化されたデバイス座標に直接変換され、すべてのクリッピング プレーンを再び超えて拡張されます。 .

最後に、glViewportレンダリング先のバッファのサイズを定義します。したがって、通常は画面サイズと一致します。効果的に小さくすると、画面サイズが小さくなりますが、実際の G​​LUT ウィンドウ サイズは変わりません。数学的に言えば、フラグメントが正規化されたデバイス座標から画面座標に投影される方法を変更します。

于 2012-04-27T22:16:55.660 に答える