cocos2dx的Render Command的肤浅见解

来源:互联网 发布:project tango 淘宝 编辑:程序博客网 时间:2024/05/16 06:30

渲染过程:

Render Command种类:

  1. BatchComand 批处理渲染: SpriteBatchNode, 精灵表SpriteFrameCache
  2. CustomCommand 自定义,自己扩充,函数调用: execute()
  3. GroupComand 未知,不明,跟RenderQueue有关
  4. MeshComand 3D的建模,网格
  5. PrimitiveComand 貌似是渲染图元的Render Command
  6. 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??




0 0
原创粉丝点击