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

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之前不支持。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
当使用`glDrawElements`函数进行绘制时,需要递一些参数来指定绘制的方式和绘制的对象。下面是对`glDrawElements`函数的各个参数进行详细解析: ```cpp void glDrawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid* indices); ``` 1. `mode`:指定绘制的图元类型,可以是以下之一: - `GL_POINTS`:绘制一系列点。 - `GL_LINES`:绘制一系列单独的线段。每两个顶点定义一条线段。 - `GL_LINE_STRIP`:绘制一系列连接的线段。每个顶点连接到下一个顶点,最后一个顶点连接到第一个顶点。 - `GL_LINE_LOOP`:绘制一系列连接的线段。每个顶点连接到下一个顶点,最后一个顶点连接到第一个顶点,形成一个封闭的环。 - `GL_TRIANGLES`:绘制一系列单独的三角形。每三个顶点定义一个三角形。 - `GL_TRIANGLE_STRIP`:绘制一系列带有相邻三角形共享边的三角形。开始的三个顶点定义第一个三角形,之后的每个顶点都会和前两个顶点组成一个新的三角形。 - `GL_TRIANGLE_FAN`:绘制一系列带有公共中心顶点的三角形。开始的顶点是公共中心顶点,之后的每个顶点都和前一个顶点以及公共中心顶点组成一个新的三角形。 2. `count`:指定要绘制的索引数目,即索引数组中的元素个数。 3. `type`:指定索引数据的类型,可以是以下之一: - `GL_UNSIGNED_BYTE`:每个索引使用一个无符号字节。 - `GL_UNSIGNED_SHORT`:每个索引使用一个无符号短整型。 - `GL_UNSIGNED_INT`:每个索引使用一个无符号整型。 4. `indices`:指定用于绘制的索引数据的指针。这个指针指向索引数据的起始位置。 通过这些参数,您可以使用`glDrawElements`函数来绘制不同类型的图元,以及指定使用何种类型和数量的索引数据。希望这能帮助您理解`glDrawElements`函数的使用!如果您还有其他问题,请随时提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值