1.opengl的渲染
要想了解自动材质合并,那么就必须清楚它是怎么实现的。opengl的管线渲染度娘一抓一大把我就不详细的说了。主要提与自动材质合并概念有联系的俩个关键点,顶点着色器与片段着色器。他们是干啥的我真不想说,因为度娘也会告诉你。但是我想告诉你的是实际上自动材质合并就是省略上传材质步骤,而只上传顶点坐标,通过这样减少大量材质上传寄存器的IO消耗来达到渲染优化。
2.cocos2dx的自动材质合并实现方式
for(const auto& cmd : _batchedCommands) { auto newMaterialID = cmd->getMaterialID(); if(_lastMaterialID != newMaterialID || newMaterialID == MATERIAL_ID_DO_NOT_BATCH) { //Draw quads if(indexToDraw > 0) { glDrawElements(GL_TRIANGLES,(GLsizei) indexToDraw,GL_UNSIGNED_SHORT,(GLvoid*) (startIndex*sizeof(_indices[0])) ); _drawnBatches++; _drawnVertices += indexToDraw; startIndex += indexToDraw; indexToDraw = 0; } //Use new material cmd->useMaterial(); _lastMaterialID = newMaterialID; } indexToDraw += cmd->getIndexCount(); }
这里我们可以明白一个道理,它的优化方法很单纯,也就是说临近的俩个渲染对象如果他们所使用的材质相同,那么他们在渲染的时候只有第一个使用到该材质的对象会向GPU提交材质到寄存器,之后临近的所有使用到该材质的对象将不再进行材质提交过程。
这优化就是如此简单。
这优化就是如此简单。