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 之前,数组索引中的所有值必须位于 start 和 end 之间(包括两端)。

开始和结束索引是在将基本顶点添加到它们之前的索引。这个想法是您的开始/结束索引匹配索引数组中的内容,而不是后偏移索引值。

另外,您引用的行是错字;实际规范说:

位于范围之外的索引值 [start; end] 的处理方式与DrawRangeElements相同。

OpenGL Wiki上的错字已更正。

于 2013-02-04T20:28:06.480 回答