exportclassWebGLRenderContext{ ... public $drawWebGL() { let length = this.drawCmdManager.drawDataLen; let offset = 0; for (let i = 0; i < length; i++) { let data = this.drawCmdManager.drawData[i]; //合好批次的绘制命名(其实数据data), 并没有像 cocos 一样提供回调函数, 然用户自己写绘制的代码 offset = this.drawData(data, offset);
使用对应的 shader 绘制该批次
1 2 3 4 5 6 7 8 9 10 11
exportclassWebGLRenderContext{ ... privatedrawData(data: any, offset: number) { ... switch (data.type) { case DRAWABLE_TYPE.TEXTURE: if (filter) { if (filter.type === "custom") { program = EgretWebGLProgram.getProgram(gl, filter.$vertexSrc, filter.$fragmentSrc, filter.$shaderKey); // 使用了 滤镜 等特殊效果的, 会用不同shader来绘制这一批次 ... offset += this.drawTextureElements(data, offset); // 执行一次绘制
提交绘制数据给图形显卡
1 2 3 4 5 6 7
private drawTextureElements(data: any, offset: number): number { let gl: any = this.context; gl.bindTexture(gl.TEXTURE_2D, data.texture); let size = data.count * 3; gl.drawElements(gl.TRIANGLES, size, gl.UNSIGNED_SHORT, offset * 2); return size; }