渲染过程:
Render Command种类:
- BatchComand 批处理渲染: SpriteBatchNode, 精灵表SpriteFrameCache
- CustomCommand 自定义,自己扩充,函数调用: execute()
- GroupComand 未知,不明,跟RenderQueue有关
- MeshComand 3D的建模,网格
- PrimitiveComand 貌似是渲染图元的Render Command
- QuadComand 纹理绘制
绘制sprite调用Draw()时候是先生成QuadComand提交到Renderer,由Renderer统一绘制,不同Node使用不同的RenderCommand
关于Sprite:
Sprite已经实现自动批处理,
每次render时,比较这次getMaterialID和上材料ID(MaterialID)不同才调用DrawElements,
纹理MaterialID由物质材料,灯光,着色器,纹理ID和Blend模式(混合模式)一起决定
QuadCommand的materialID的生成int glProgram = (int)_glProgramState->getGLProgram()->getProgram();
int intArray[4] = { glProgram, (int)_textureID, (int)_blendType.src, (int)_blendType.dst};
_materialID = XXH32((const void*)intArray, sizeof(intArray), 0);
_materialID是一个uint32_t类型的值
void Sprite:draw(Renderer *renderer, constMat4& transform, uint32_t flags)
{
_quadCommand.init(_globalZOrder, _texture->getName(),getGLProgramState(), _blendFunc, &_quad, 1, transform)
renderer->addCommand(&_quadCommand);
….
}
@param renderer: 渲染的总控制
@param transform : 移动,旋转,缩放等顶点变换矩阵,MV矩阵
@flags : 是否更新ContentSize或者transform??