0

OpenGL Deferred Rendering にどの関数を使用する必要があるかについては、少し混乱しています。

VBO(頂点バッファオブジェクト)のリストがあります

それぞれが(位置+色)のような頂点のタイプを表します

インデックス用もあります

私の問題は、さまざまなオブジェクトをレンダリングしたいときに発生します

1) 頂点バッファーをアクティブにする 2) インデックス バッファーをアクティブにする directX の方法を使用します。3) 描画呼び出しでプリミティブ型を頂点バッファーからの開始頂点、最小頂点インデックス、頂点カウント、開始インデックスとプリミバイト カウント

私が使用できるため、openGLで私は失われました:

glDrawElements - ただし、これはレンダリング モード、オブジェクト カウント、インデックス バイト タイプ、およびインデックスを使用します

これは基本的に、VBOの開始時にレンダリングされることを示していますが、そこに複数のオブジェクトがある場合は役に立ちません。

VBO のどこからレンダリングを開始し、頂点の開始位置を指定できるかを openGL が持っているレンダリング関数の手がかりは誰にもありますか? 誰かが何か考えてくれることを願っています =\

4

3 に答える 3

1

glDrawElements は、VBO の先頭からではなく、開始するポインターを指定した場所から開始します。

VBO があり、その後半からレンダリングを開始したい場合は、開始するバイト オフセットを glVertexAttribPointer の最後の属性として設定します。

于 2012-11-01T21:50:45.660 に答える
0

いくつかのオプションがあります。

glVertexAttribPointerオブジェクトを描画する前にさらに呼び出しを発行することで、特定の各オブジェクトの頂点データの開始位置を変更できます。または、 glDrawElementsBaseVertexを使用して、フェッチされたすべてのインデックスが追加される頂点インデックスを指定できます。

後者は、サポートされている Intel 以外のハードウェアで利用できるはずです。

于 2012-11-02T01:57:02.577 に答える
0

編集:シェーダーを使用していない場合、これは当てはまらない可能性があることに気付きましたが、レガシー OpenGL に慣れていないため、私の投稿がどのような利点があるのか​​ わかりません。使用している/対象としているバージョンは何ですか?

最近、glDrawElements hereに関する質問をしました。うまくいけば、私が投稿したものがいくつかの説明/例を提供します.

私が理解している方法:あなたのインデックスはあなたによって決定されるので、2番目の頂点から始めたい場合は、試すことができます(基本的なスケルトンには glVertexAttribPointer 呼び出しなどはありませんが、必要に応じて追加できます):

const float VBOdata = {
    //Some X and Y  coordinates for triangle1 (in the first quadrant)
    //(z = 0, w = 1 and are not strictly necessary here)
     0.0f,  1.0f, 0.0f, 1.0f //index 0
     0.0f,  0.0f, 0.0f, 1.0f  //1
     1.0f,  0.0f, 0.0f, 1.0f  //2

    //Some X and Y coordinates for triangle2 (in the second quadrant)
     0.0f, -1.0f, 0.0f, 1.0f  //3
     0.0f,  0.0f, 0.0f, 1.0f  //4
    -1.0f,  0.0f, 0.0f, 1.0f  //5

    //Now some color data (all white)
     1.0f, 1.0f, 1.0f, 1.0f,  //0
     1.0f, 1.0f, 1.0f, 1.0f,  //1
     1.0f, 1.0f, 1.0f, 1.0f,  //2

     1.0f, 1.0f, 1.0f, 1.0f,  //3
     1.0f, 1.0f, 1.0f, 1.0f,  //4
     1.0f, 1.0f, 1.0f, 1.0f,  //5
    };

const GLubyte indices[] = {
    3, 4, 5, 
};

glDrawElements(GL_TRIANGLES, 3, GL_UNSIGNED_BYTE, indices);

GL_TRIANGLES はプリミティブのタイプ、3 は「インデックス」内の要素の数、GL_UNSIGNED_BYTE はそれらの解釈方法、「インデックス」は配列の名前です。

これにより、2 番目の三角形のみが描画されます。glDrawElementsBaseVertexを試すこともできますが、個人的には試していません。私が収集したのは、0 から始まるインデックスを生成/明示的にコーディングするが、実際には 0+offset、1+offset などで読み取るようにオフセットを与えるということです。

これは役に立ちますか?

于 2012-11-01T21:58:46.140 に答える