0

画面に赤い長方形を描画しようとしているopenglプロジェクトがあります。問題は、1)巨大で、画面のほぼ全体を占めること、2)傾斜していることです。私はopenglを初めて使用するので、座標系と、glOrtho()関数などのいくつかの関数が何をするのかを理解していません。

コードは次のとおりです。

void display()
{
   glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

   glBegin(GL_QUADS);     
      glColor3f(1, 0, 0);  // NOT SURE WHERE THIS STARTS, AND HOW THE COORDINATES WORK
        glVertex2f(-1.0f, 1.0f); 
        glVertex2f( 1.0f, 1.0f);  
        glVertex2f( 1.0f,-1.0f);        
        glVertex2f(-1.0f,-1.0f);   
    glEnd();                  

   glFlush();
}

void init()
{
   glClearColor(0.0, 0.0, 0.0, 1.0);
   glMatrixMode(GL_PROJECTION);
   glLoadIdentity();
   glOrtho(0, 10.0, 0, 10.0, -1.0, 1.0); //What does this do and how does it's coordinates work?
   glMatrixMode(GL_MODELVIEW);
   glLoadIdentity();
   glRotatef(30.0, 1.0, 1.0, 1.0);
   glEnable(GL_DEPTH_TEST);
}

int main(int argc, char *argv[])
{
    glutInit(&argc, argv);
    glutInitWindowSize(600, 600);
    glutInitWindowPosition(250, 250);
    glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE | GLUT_DEPTH);
    glutCreateWindow("Model View");


    glutDisplayFunc(display);

   init();
    glutMainLoop();

    return 0;
}

とにかく、これを学習体験にしたいと思いますので、役立つことを説明してリンクしてください!ありがとう。

4

2 に答える 2

5

手順表示は実際の図面を担当します。

void display()
{

この行はバッファをクリアします; バッファは基本的に、画像がレンダリングされるメモリです。基本的に、幅と高さが600x600のマトリックスです。クリアとは、マトリックスのすべてのセルを同じ値に設定することを意味します。すべてのセルはピクセルであり、深さが含まれています。この呼び出しでは、OpenGLにすべてを不透明な黒でペイントし、深さを1にリセットするように指示しています。なぜ不透明な黒なのですか?glClearColorを呼び出したため、最初の3つのパラメーターは赤、緑、青のコンポーネントであり、0から1の範囲で指定できます。0,0,0は黒を意味します。最後に指定したコンポーネントに1を指定しました。これは、不透明を意味します。0は透過的です。この最後のコンポーネントはアルファと呼ばれますアルファブレンディングが有効になっている場合に使用されます。なぜ明確な深さが1なのですか?1がデフォルトであり、その値をオーバーライドするためにglClearDepthを呼び出さなかったためです。

   glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

これは、四角形を描画することをOpenGLに通知しています。

   glBegin(GL_QUADS);

これらの四辺形を赤にする必要があります(色の最初のコンポーネントが赤であることを忘れないでください)。

      glColor3f(1, 0, 0);  // NOT SURE WHERE THIS STARTS, AND HOW THE COORDINATES WORK

ここで、四辺形の頂点をリストします(これは、1つ、4つの頂点のみです)。glColor3fを呼び出して色を更新することはないため、すべての頂点が赤になります。すべての頂点に異なる色を関連付けることができます。赤(1,0,0)、緑(0,1,0)、青(0,0,1)、白(1)を選択すると、最終的な結果は通常非常にかわいいです。 、1,1); この四辺形は、幾何学的に正方形であり、ウィンドウは正方形であり、カメラ(glOrthoで定義)は正方形のアスペクト(glOrthoの呼び出しの最初の4つのパラメーター)を持っているため、画面は正方形として表示されます。glOrthoを呼び出さなかった場合、デフォルトのOpenGL座標の範囲は-1から1であり、ウィンドウ全体をカバーしているため、おそらく赤のみが表示されます。

        glVertex2f(-1.0f, 1.0f); 
        glVertex2f( 1.0f, 1.0f);  
        glVertex2f( 1.0f,-1.0f);        
        glVertex2f(-1.0f,-1.0f);   

これは、描画が完了したことを意味します。

    glEnd();                  

技術的には、OpenGLが指定したコマンドをグラフィックカードに送信しなかった可能性があります。コマンドは、効率上の理由からキューに入れられる場合があります。glFlushを呼び出すと、コマンドが強制的にグラフィックカードに送信されます。

   glFlush();
}

この関数を作成し、OpenGL状態の一部を初期化するために、アプリケーション全体で安定していると感じました。実際には、ゲームのような実際のアプリケーションでは、これらのもののほとんどが表示されます。たとえば、プレーヤーが移動すると、ゲームはカメラを継続的に更新する必要があります。

void init()
{

ここで前に述べたように、クリアカラーを不透明な黒に設定しています。

   glClearColor(0.0, 0.0, 0.0, 1.0);

ここでは、カメラは遠近法タイプではないと言っています。基本的に遠くにあるものは小さくなりません。これは、人工衛星が都市について持っている見方に似ています。特に、視野の「中心」にないカメラを作成しています。最初の実験では、glOrtho(-10.0、10.0、-10.0、10.0、-1.0、1.0)のような呼び出しを使用することをお勧めします。非遠近法カメラの場合、ここで指定する座標は、前述の-1から+1の規則を上書きします。赤い四角が小さく中央に表示されるようにパラメータを調整してください。

   glMatrixMode(GL_PROJECTION);
   glLoadIdentity();
   glOrtho(0, 10.0, 0, 10.0, -1.0, 1.0); //What does this do and how does it's coordinates work?

ここでは、基本的に、正方形に対してカメラを配置するか、カメラに対して正方形を配置します。それを見るには無限の方法があります。あなたは幾何学的変換を定義しています、そしてそれがMODELVIEWと呼ばれる理由はそれがあなたがそれを見る方法に応じてモデル(正方形)またはビュー(カメラ)を変えるユニークなものではなく、両方であるからです。ただし、glRotatefを呼び出しているため、正方形は回転しているように見えます。それを削除すると、正方形が正方形のように表示されます。

   glMatrixMode(GL_MODELVIEW);
   glLoadIdentity();
   glRotatef(30.0, 1.0, 1.0, 1.0);

デプステストは、3Dシーンの立方体の背面など、隠面を削除するためにバッファ内のデプスストアを使用する手法です。シーンは2Dであり、クワッドのみを描画しているため、これは実際には描画に影響を与えません。

   glEnable(GL_DEPTH_TEST);
}

に、OpenGLの一部ではないが、オペレーティングシステムのみが実行を許可されている退屈で退屈な操作を実行するのに役立つオプションのサブシステムであるglutと対話しています。

int main(int argc, char *argv[])
{

まず、過剰を初期化する必要があります。

    glutInit(&argc, argv);

次に、レンダリング画像を含むウィンドウを定義します。

    glutInitWindowSize(600, 600);
    glutInitWindowPosition(250, 250);

GLUT_RGBは、ウィンドウが赤、緑、青のみをサポートし、アルファチャネルを持たないことを意味します(これは非常によくあるケースです)。GLUT_DEPTHは、バッファが各ピクセルの深度を保存できることを意味します。GLUT_SINGLEは、ウィンドウがシングルバッファリングされていることを意味します。つまり、コマンドはウィンドウに直接描画します。もう1つのオプションは、ダブルバッファリングです。この場合、実際にバックバッファを描画してから、フロントバッファとバックバッファを入れ替えて、レンダリングされたイメージがプログレッシブではなく突然表示されるようにします。シーンは非常に単純なので、GLUT_SINGLEとGLUT_DOUBLEの違いに気付かないはずです。

    glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE | GLUT_DEPTH);

次に、実際にウィンドウを作成します。

    glutCreateWindow("Model View");

シーンをレンダリングするためにどの関数を呼び出す必要があるかをglutに指示します。

    glutDisplayFunc(display);

ここでは、 init関数を呼び出します。

   init();

これは、glutによって提供されるウィンドウループです。ほとんどのウィンドウシステムは、ウィンドウを存続させ、クリック、ドラッグ、サイズ変更、およびキーボードストロークに応答できるようにするためにソフトウェアループを必要とします。

    glutMainLoop();

    return 0;
}

簡単に言うと、OpenGLのいくつかのバージョンが利用可能であり、それらはいくつかの言語を使用してプログラムでき、いくつかのプラットフォームを対象としています。これらのバージョンの最も重要な違いは、固定機能パイプライン(FFP)を使用するものもあれば、プログラム可能なパイプラインを使用するものもあることです。プログラムは固定関数パイプラインを使用します。可能な場合はいつでもプログラム可能なパイプラインに切り替える必要があります。これは、コンピューターグラフィックスを実行する最新の方法であり、名前が示すように、もう少しプログラミングが必要ですが、はるかに柔軟性があります。

私が最初にリンクしたチュートリアルは無視する必要があります。それらがどれほど時代遅れであるかすぐにはわかりませんでした。datenwolfが推奨するものを使用するか、モバイル開発に興味がある場合は、OpenGL ES 2の学習を検討できます(以前のバージョンは固定機能であったため、2は重要です)。WebGLと呼ばれるHTML5およびJavascript用のOpenGLES2のバリアントもあります。チュートリアルは、すべての例を含むZIPファイルとともにここにあります。新しい概念を理解したかどうかを確認する必要があるときはいつでも、彼らのコードベースを使用します。

于 2013-02-12T00:08:06.207 に答える
0

あなたがそれを面白いと見ているので:)

(1,1)から(-1、-1)に赤い正方形を作成しました// display()

次に、カメラは正射影を使用してそれを見ると言いました// glOrtho(カメラを配置するための点を使用して方向を与える投影行列を作成します)

モデル*ビュー*を回転させると少し傾くかもしれません

PS glコマンドは、glサブシステムに送信されるメッセージとして考える必要があります。これらのメッセージは、さまざまな状態、シーンの内容、カメラの場所、ライトの場所などを変更します。

于 2013-02-11T23:38:02.180 に答える