图元绘制优化:Draw Primitive & Instancing Rendering - MartinRGB/GLES30_ProgrammingGuide_NDK GitHub Wiki

图元的绘制以及实例化渲染

glDrawArrays

使用 glDrawArrays 方法绘制图元,如果能够提供绘制顺序索引,并且顶点不共享,那么会有性能上的提升。

glDrawElements

使用 glDrawElements 绘制三角形,在 GPU 上比 glDrawArrays 效率更高。

图元重启

利用图元重启,在一次 draw 调用中渲染多个不相连的图元,能降低绘图 API 的开销。

例如:

glEnable(GL_PRIMITIVE_RESTART_FIXED_INDEX);
//绘制图元
...
glDisable(GL_PRIMITIVE_RESTART_FIXED_INDEX);

实例化绘制

几何形状实例化绘制,是高效的绘制方法,一次 API 调用 多次渲染不同属性的 一个对象,降低了 API 调用的 CPU 处理开销,API 接口如下:

glDrawArraysInstanced(mode,first,count,instanceCount)

glDrawElementsinstanced(mode,count,type,const GLvoid *indices,GLsizei instanceCount)

例如在 repo 的案例7:

在绘制函数中,for loop 批量增加了 mvp矩阵属性 颜色属性 并生成、绑定缓冲对象来装载属性

在更新绘制函数中, for loop 批量修改了矩阵的 偏移量旋转角度起始偏差

#define NUM_INSTANCES 100
   ...
   // Random color for each instance
   {
      GLubyte colors[NUM_INSTANCES][4];
      int instance;

      // 0 is seed
      srandom ( 0 );

      for ( instance = 0; instance < NUM_INSTANCES; instance++ )
      {
         colors[instance][0] = random() % 255;
         colors[instance][1] = random() % 255;
         colors[instance][2] = random() % 255;
         colors[instance][3] = 0;
      }

      glGenBuffers ( 1, &userData->colorVBO );
      glBindBuffer ( GL_ARRAY_BUFFER, userData->colorVBO );
      glBufferData ( GL_ARRAY_BUFFER, NUM_INSTANCES * 4, colors, GL_STATIC_DRAW );
   }