当我们开始学习opengl的时候,一般都是采用glBegin()和glEnd()对之间进行绘图,下面给一段代码。
GLfloat v[6] = { -1.0 , -0.58 , 1.0 , -0.58 , 0.0 , 1.15 };
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(0.0, 0.0, 1.0);
glViewport(0, 0, 300, 400);
glBegin(GL_TRIANGLES);
for (size_t i = 0; i < 3; i++)
{
glVertex2f(v[2 * i + 0], v[2 * i + 1]);
}
glEnd();
由上面的例子可以看出绘制一个三角形必须调用glVertex2f()三次。为了减少函数调用的次数我们可以采用顶点数组,目前顶点数组有三个opengl函数:glDrawArrays(),glDrawElements()和glDrawRangeElements(),函数原型如下:
GL_APICALL void GL_APIENTRY glDrawArrays (GLenum mode, GLint first, GLsizei count);
参数说明:
mode,绘制方式,OpenGL2.0以后提供以下参数:GL_POINTS、GL_LINES、GL_LINE_LOOP、GL_LINE_STRIP、GL_TRIANGLES、GL_TRIANGLE_STRIP、GL_TRIANGLE_FAN。
first,从数组缓存中的哪一位开始绘制,一般为0。
count,数组中顶点的数量。
void glDrawElements( GLenum mode, GLsizei count,GLenum type, const GLvoid *indices);
参数说明
mode指定绘制图元的类型,它应该是下列值之一,GL_POINTS, GL_LINE_STRIP, GL_LINE_LOOP, GL_LINES, GL_TRIANGLE_STRIP, GL_TRIANGLE_FAN, GL_TRIANGLES, GL_QUAD_STRIP, GL_QUADS, and GL_POLYGON.
count为绘制图元的数量乘上一个图元的顶点数。
type为索引值的类型,只能是下列值之一:GL_UNSIGNED_BYTE, GL_UNSIGNED_SHORT, or GL_UNSIGNED_INT。
indices:指向索引存贮位置的指针。
glDrawElements()比较类似,glDrawRangeElements()也可以在数组中跳跃访问。然而,glDrawRangeElements()还有两个额外的参数(开始和结束位置的索引)来指定顶点的范围。通过添加这个范围限制,OpenGL可以只获得访问有限范围的顶点的来优先渲染,这样可能提高性能。
下面给出顶点数组绘制三角形的示例代码
//方法二
GLfloat v[6] = { -1.0 , -0.58 , 1.0 , -0.58 , 0.0 , 1.15};
glClear(GL_COLOR_BUFFER_BIT) ;
glColor3f(0.0 , 0.0 , 1.0) ;
glViewport(0 ,0 , 300 , 400) ;
glEnableClientState(GL_VERTEX_ARRAY);
glVertexPointer(2, GL_FLOAT, 0, v);
glDrawArrays(GL_TRIANGLES, 0, 6);
glDisableClientState(GL_VERTEX_ARRAY);
glColor3f(1.0 , 0.0 ,0.0) ;
glViewport(300 , 0 , 300 , 400) ;
glRotatef(90 , 0 , 0 , 1) ;
glEnableClientState(GL_VERTEX_ARRAY);
glVertexPointer(2, GL_FLOAT, 0, v);
glDrawArrays(GL_TRIANGLES, 0, 6);
glDisableClientState(GL_VERTEX_ARRAY);
/*************************************/
//方法三
GLfloat v[6] = { -1.0 , -0.58 , 1.0 , -0.58 , 0.0 , 1.15 };
GLubyte indices[3] = { 0 , 1 , 2 };
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(0.0, 0.0, 1.0);
glViewport(0, 0, 300, 400);
glEnableClientState(GL_VERTEX_ARRAY);
glVertexPointer(2, GL_FLOAT, 0, v);
glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_BYTE, indices);
glDisableClientState(GL_VERTEX_ARRAY);
glColor3f(1.0, 0.0, 0.0);
glViewport(300, 0, 300, 400);
glRotatef(90, 0, 0, 1);
glEnableClientState(GL_VERTEX_ARRAY);
glVertexPointer(2, GL_FLOAT, 0, v);
glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_BYTE, indices);
glDisableClientState(GL_VERTEX_ARRAY);
/********************************************/