• 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)中的数据一次生成之后,就不能改变。若要改变,就需要重新生成。

  • 相关阅读:
    迭代器和生成器
    New test
    MySQL笔记整理
    Python基础数据类型
    Python基础
    Python入门知识
    Linux / MacOS 下Redis 安装、配置和连接
    NuGet的使用心得
    简单工厂模式和策略模式的区别与结合
    NuGet的使用和服务搭建
  • 原文地址:https://www.cnblogs.com/unsigned/p/1965361.html
Copyright © 2020-2023  润新知