近些年来,随着半导体工业的发展,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)中的数据一次生成之后,就不能改变。若要改变,就需要重新生成。