OPENGL学习笔记整理(四):几何图元渲染

近些年来,随着半导体工业的发展,GPU的性能越来越强大,但对几何图元的渲染速度的加快依然十分有限。在这里,我并不是想讨论如何改进硬件以加快速度,而是讨论OPENGL中几种几何图元的渲染方式的特点,即速度和适用环境。

我把它们分成三种方式:

(a)最基本的几何图元操作,所谓最基本,就是无法再细分,即这里所调用的任何一个单独的函数不能用其它的OPENGL函数或函数组合所替代。

  void glVertex[234]{sifd}(TYPE coords);

  void glVertex[234]{sifd}v(const TYPE* coords);

  void glBegin(GLenum mode); mode:GL_POINTS,GL_LINES,GL_LINE_STRIP,GL_LINE_LOOP,GL_TRIANGLES,GL_TRIANGLE_STRIP,GL_TRIANGLE_FAN,GL_QUADS,GL_QUAD_STRIP,GL_POLYGON

  void glEnd(void);

(b)使用顶点数组

  1.启用

    void glEnableClientState(GLenum array);

  2.指定数组的数据

    void glVertexPointer(GLint size, GLenum type, GLsizei stride, const GLvoid* pointer);

  3.解引用和渲染

    void glArrayElement(GLint ith);

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

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

    void glDrawArrays(GLenum mode, GLint first, GLsizei count);

    void glMultiDrawArrays(GLenum mode, GLint *first, GLsizei* count, GLsizei primcount);

(c)显示列表

  1.命名和创建显示列表

    GLuint glGenLists(GLsizei range);

    void glNewList(GLuint list, GLenum mode);

  2.(a)中的所有函数

  3.glEndList()

  4.调用显示列表

    void glCallList(GLuint list);

 渲染速度总是相对而言的,在数据量大小不同的时候,以上三种方式的优劣亦不同。

假设数据量小,方式(a)最佳,为什么不是方式(b)或(c)呢?先说方式(b),它的出现就是因为为了在数据量大的时候,减少函数的调用,而这里所指的函数就是(a)中的函数;而方式(c),它的作用也是为了减少大数据量的渲染时间而设计的,显示列表时在程序初始化时声明的,它是一次执行之后,可以多次调用,速度很快。显然,方式(b)(c)都是为了大数据量而设计的。他们两者的区别在于,(b)中的数据比较容易改变,并在改变之后迅速渲染,(c)中的数据一次生成之后,就不能改变。若要改变,就需要重新生成。

原文地址:https://www.cnblogs.com/unsigned/p/1965361.html