欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

glDrawElements参数在新旧版本传最后一个参数的不同

程序员文章站 2022-07-03 20:48:43
...

glDrawElements函数如下:

void glDrawElements(	GLenum  	mode,
 	                    GLsizei  	count,
 	                    GLenum  	type,
 	                    const GLvoid *  	indices);

glDrawElements函数声明如上面,其中最后一个参数表示存放顶点索引的数组。在OPenGL 3.0之前,我们一般直接传入顶点索引数组,如下:

glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
    glColor3f(1.0f,0.0f,0.0f);

    //四个顶点  
    float pfVer[] = { 0.0f, 0.0f,   0.0f, 
        2.0f, 0.0f,   0.0f,  
        2.0f, 2.0f, 0.0f,  
        0.0f,   2.0f, 0.0f };  
    //两个面  
    short indices[] = {0,1,2,  
         2,3,0 };  

    glEnableClientState(GL_VERTEX_ARRAY);//启用顶点数组,很重要,否则不显示
    //参数1:表示该pfVer数组中几个元素表示一个点,这里是三维点,当然是3个数据表示一个点
    //参数2:指示pfVer数组中元素的数据类型
    //参数3:表示跨度,这里为0,表示数据元素没有跨度,即依次每3个元素表示一个点
    //参数4:顶点数据数组
    glVertexPointer( 3,GL_FLOAT, 0, pfVer );  //指定顶点指针,必须的,指向真正的点数据
    //这个函数的参数列表前面已经解释过了。我们重点看下,第二个参数,即要画的几何图形的顶点的个数,这里因为要画2个面,每个面3个顶点,所以是6个。
    //最后一个参数,传递是indices
    glDrawElements( GL_TRIANGLE_STRIP,2*3,GL_UNSIGNED_SHORT, indices );  
    
    ...... // 后续代码略

 而在OPenGl 3.0后,最后一个参数可以直接传NULL,如下:

  // A single triangle
    static const GLfloat vertex_positions[] =
    {
        -1.0f, -1.0f,  0.0f, 1.0f,
         1.0f, -1.0f,  0.0f, 1.0f,
        -1.0f,  1.0f,  0.0f, 1.0f,
        -1.0f, -1.0f,  0.0f, 1.0f,
    };
 
  // Color for each vertex
    static const GLfloat vertex_colors[] =
    {
        1.0f, 1.0f, 1.0f, 1.0f,
        1.0f, 1.0f, 0.0f, 1.0f,
        1.0f, 0.0f, 1.0f, 1.0f,
        0.0f, 1.0f, 1.0f, 1.0f
    };

   static const GLushort vertex_indices[] =
    {
        0, 1, 2
    };

    // Set up the element array buffer
    glGenBuffers(1, ebo);
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ebo[0]);
    glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(vertex_indices), vertex_indices, GL_STATIC_DRAW);

    // Set up the vertex attributes
    glGenVertexArrays(1, vao);
    glBindVertexArray(vao[0]);

    glGenBuffers(1, vbo);
    glBindBuffer(GL_ARRAY_BUFFER, vbo[0]);
    glBufferData(GL_ARRAY_BUFFER, sizeof(vertex_positions) + sizeof(vertex_colors), NULL, GL_STATIC_DRAW);
    glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(vertex_positions), vertex_positions);
    glBufferSubData(GL_ARRAY_BUFFER, sizeof(vertex_positions), sizeof(vertex_colors), vertex_colors);

    glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, 0, NULL);
    glVertexAttribPointer(1, 4, GL_FLOAT, GL_FALSE, 0, (const GLvoid *)sizeof(vertex_positions));
    glEnableVertexAttribArray(0);
    glEnableVertexAttribArray(1);




// Set up for a glDrawElements call
    glBindVertexArray(vao[0]);
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ebo[0]);

    model_matrix = vmath::translate(-1.0f, 0.0f, -5.0f);
    glUniformMatrix4fv(render_model_matrix_loc, 1, GL_FALSE, model_matrix);
    glDrawElements(GL_TRIANGLES, 3, GL_UNSIGNED_SHORT, NULL);

当你用glBufferData、glBindVertexArray、glVertexAttribPointer等函数后,OPenGL知道去哪里(索引缓冲区)取索引数据,不用指定最后一个参数。同理:、glDrawElementsBaseVertex函数的倒数第二个参数在OPenGl 3.0或以后也传NULL,该函数在3.0之前不支持。

相关标签: OpenGL