0

glDrawRangeElementsBaseVertex() の使用中に疑問に直面しています。

以下はソースコードです:

GLfloat vertices[]=
    {
        -0.9,-0.9,1.0,1.0,
        -0.1,-0.9,1.0,1.0,
        -0.1,-0.1,1.0,1.0,
        -0.9,-0.1,1.0,1.0,


        0.1,0.1,1.0,1.0,
        0.9,0.1,1.0,1.0,
        0.9,0.9,1.0,1.0,
        0.1,0.9,1.0,1.0,

        -0.9,0.1,1.0,1.0,
        -0.1,0.1,1.0,1.0,
        -0.1,0.9,1.0,1.0,
        -0.9,0.9,1.0,1.0,

        0.1,-0.1,1.0,1.0,
        0.1,-0.9,1.0,1.0,
        0.9,-0.9,1.0,1.0,
        0.9,-0.1,1.0,1.0
    };

GLuint indices_uint[]=
    {
          0,1,2,3,222,//Triangle 0 
          4,5,6,7,222,//Triangle 1
          8,9,10,11,222,//Triangle 2    
          12,13,14,15,222,//Triangle 3

          4,5,6,7,222,//Triangle 1
          8,9,10,11,222,//Triangle 2    
          4,5,6,7,222,//Triangle 1        
          12,13,14,15,222//Triangle 3
    };

glEnable(GL_PRIMITIVE_RESTART);

glPrimitiveRestartIndex(222);

glEnableVertexAttribArray(position);

glVertexAttribPointer(position, 4, GL_FLOAT, GL_FALSE, 0,vertices);

glDrawRangeElementsBaseVertex(GL_TRIANGLE_STRIP,0,7,10,GL_UNSIGNED_INT,indices_uint,4);

出力が正確にどうあるべきかわかりません。コードは三角形 1 と三角形 2 をレンダリングします。 [start,end] を [0,7] として渡すと、三角形 2 はどのくらい正確に描画されますか

仕様には次のように書かれています:

Index values lying outside the range [start, end] are treated in the same way as glDrawElementsBaseVertex()

{8,9,10,11} が [0,7] の範囲外であっても、レンダリングに使用されるということですか? もしそうなら、なぜ glDrawRangeElementsBaseVertex() を使わなければならないのでしょうか?

4

1 に答える 1

1

仕様には次のように書かれています:

そして、その行の直前に、仕様は次のように述べています。

basevertex を追加する前に、配列 index のすべての値が start と end の間にある必要があるという追加の制約があります。

開始インデックスと終了インデックスは、ベース頂点を追加する前のインデックスです。開始/終了インデックスは、オフセット後のインデックス値ではなく、インデックス配列の内容と一致するという考えです。

また、引用した行はタイプミスです。実際の仕様は次のように述べています。

範囲外のインデックス値 [開始; end] はDrawRangeElementsと同じように扱われます。

OpenGL Wikiでタイプミスが修正されました。

于 2013-02-04T20:28:06.480 に答える