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之前不支持。
上一篇: TypeScript 类型断言