图元绘制优化: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 );
}