1

私はopenglに本当に慣れていないので、今は基本を学んでいます。高レベルの質問があります。オブジェクトを作成したい場合は、すべてのオプションである列を言ってください。

  1. 外部プログラム (3DStudio など) から 3D メッシュをインポートし、opengl にロードします。
  2. glVertex3f を使用して 6 つのポリゴンを作成する
  3. グルグルコール?(私はglutSolidCubeを見たことがありますが、glutSolidColumnのようなものはありません)

私の質問は次のとおりです。

A) 他の方法はありますか?

B) 3DStudio メッシュを使用しない場合、opengl で通常のオブジェクト/アニメーション化されたオブジェクトを作成する正しい方法はどれですか?

C) 2) で列を作成するこのコードは正しいですか? (そうである場合は、x、y、z 変数を使用してパラメーター化し、特定の高さの特定の床タイルの列を作成しようとします)

//Column
//Wall
glBegin(GL_POLYGON); 
    glVertex3f(150.0f, 250.0f,50);   // x1, y1 - top-left corner    
    glVertex3f(50.0f, 250.0f,50);   // x2, y1 - top-right corner
    glVertex3f(50.0f, 50.0f,50);        // x2, y2 - bottom-right corner
    glVertex3f(150.0f, 50.0f,50);    // x1, y2 - bottom-left corner

glEnd( );

//Wall
glBegin(GL_POLYGON); 
    glVertex3f(50.0f,  250.0f,0);   // x1, y1 - top-left corner 
    glVertex3f(150.0f, 250.0f,0);  // x2, y1 - top-right corner
    glVertex3f(150.0f, 50.0f,0);   // x2, y2 - bottom-right corner
    glVertex3f(50.0f,  50.0f,0);    // x1, y2 - bottom-left corner
glEnd( );

//Wall
glBegin(GL_POLYGON);
    glVertex3f(150.0f, 250.0f,0);       // x1, y1 - top-left corner 
    glVertex3f(150.0f, 250.0f,50.0f);   // x2, y1 - top-right corner
    glVertex3f(150.0f, 50.0f,50.0f);        // x2, y2 - bottom-right corner
    glVertex3f(150.0f, 50.0f,0);    // x1, y2 - bottom-left corner
glEnd( );

//Wall
glBegin(GL_POLYGON);
    glVertex3f(50.0f, 250.0f,50);       // x1, y1 - top-left corner 
    glVertex3f(50.0f, 250.0f,0);    // x2, y1 - top-right corner
    glVertex3f(50.0f, 50.0f,0);     // x2, y2 - bottom-right corner
    glVertex3f(50.0f, 50.0f,50);    // x1, y2 - bottom-left corner
glEnd( );

//Floor
glBegin(GL_POLYGON);
    glVertex3f(50.0f, 50.0f, 0);        // x1, y1 - top-left corner 
    glVertex3f(50.0f, 50.0f, 50);   // x2, y1 - top-right corner
    glVertex3f(0, 50.0f, 50);       // x2, y2 - bottom-right corner
    glVertex3f(0, 50.0f, 0);    // x1, y2 - bottom-left corner
glEnd( );

//Ceiling
glBegin(GL_POLYGON);
    glVertex3f(50.0f, 250.0f, 0);       // x1, y1 - top-left corner 
    glVertex3f(50.0f, 250.0f, 50);  // x2, y1 - top-right corner
    glVertex3f(0, 250.0f, 50);      // x2, y2 - bottom-right corner
    glVertex3f(0, 250.0f, 0);    // x1, y2 - bottom-left corner
glEnd( );
4

2 に答える 2

5

それはあなたの正しい定義に依存します。1 つずつ答えるには:

  1. これが最も普通の方法です。ただし、OpenGL はレンダリング ライブラリのみであり、関心のあるファイル形式をロードするコードを提供するかどうかはユーザー次第です。
  2. glVertex3f は適切な選択ではありません。以下の説明を参照してください。
  3. GLUT は OpenGL の一部ではありませんが、そうです。プリミティブ オブジェクトを描画できるさまざまなサードパーティ ライブラリがあります。GLUTは1つです。

Re: glVertex3f と glBegin/glEnd の呼び出し。現時点では、レンダリング パイプラインの他の部分を調査できるようにするための簡単な手段として学習している場合は問題ありません。ただし、それらは推奨されておらず、最適ではないため、永続的にバインドする必要はありません。このため、それらは OpenGL ES または WebGL では複製されません。

CPU と GPU 間の通信にはコストがかかります。通信で転送するデータが多いほど、コストが高くなります。ただし、2 つの非同期デバイスと並列デバイスの間で一時的な同期が必要なため、小さな呼び出しでもかなりのコストがかかります。

したがって、glBegin/glVertex3f/glEnd は、すべてのデータが CPU に置かれ、多くの呼び出しによってドライバーに少しずつ転送されるため、不適切です。最初のステップとして、glVertexPointer (1 つのステップですべての頂点データを提供するため) と glDrawArrays または glDrawElements のいずれか (1 つのステップですべての glBegin/glEnd 呼び出しに相当するものを実行するため) の使用に切り替えることをお勧めします。そこから、頂点配列オブジェクトを介して、CPU ではなく GPU にデータを保存することに移行できます。

于 2011-02-27T21:53:34.530 に答える
4

オブジェクトをレンダリングする方法は 1 つしかなく、そこに到達する方法はいくつかあります。1 つの方法は、オブジェクトの (表示されている) 面ごとにポリゴンを記述することです。

OpenGL 1.x では、 、 、 を意味glBeginglVertexますglEnd

OpenGL 2.x では、これは , を意味glVertexPointerしますglDrawArrays(ただし、1.x の方法は引き続き機能します)。

OpenGL 3.x では、頂点バッファ オブジェクトを作成し、それをバインドし、glDrawArrays(1.x および 2.x メソッドは互換モードでのみ機能します)。

glutSolidCubeやモデル メッシュをロードするライブラリなどのヘルパー関数は、これらと同じメソッドを内部的に使用します。

于 2011-02-27T21:52:25.590 に答える