opengl顶点数组

当我们开始学习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);
    /********************************************/

你可能感兴趣的:(opengl)