1、用途:我把cocos2d生成的文字字形缓存起来以提高效率,没有走CCLabelTTF--CCSprite那套,而是直接使用CCTexture2D::drawAtPoint绘制到屏幕上。所以一个纹理要直接支持颜色设置(把文字绘制成不同颜色)。
2、基本流程:
a、纹理创建的时候使用 setShaderProgram(CCShaderCache::sharedShaderCache()->programForKey(kCCShader_PositionTextureColor)); 设置shader
b、draw的时候先开启颜色设置 ccGLEnableVertexAttribs( kCCVertexAttribFlag_Position | kCCVertexAttribFlag_TexCoords | kCCVertexAttribFlag_Color);
c、启用shader
if (m_pShaderProgram) {d、把颜色值传入: glVertexAttribPointer(kCCVertexAttrib_Color, 4, GL_UNSIGNED_BYTE, GL_TRUE, 0, colors);
m_pShaderProgram->use();
m_pShaderProgram->setUniformsForBuiltins();
}
可见,opengles2.0之后,万事万物皆shader,设置纹理颜色本质上还是通过shader来完成的。
3、最开始出现的bug: 纹理颜色不正确,并且文字毛边很严重,怎么修改shader都不对。
4、Bug出现的原因: 没有理解 glVertexAttribPointer第四个参数的含义,colors是CLByte类型,但是这个参数传递的又是GL_FALSE,修改为GL_TRUE后正常。
5、反思:其实可以更快的找到问题,因为生产字形的过程跟原来一模一样,所以只要仔细比对下CCSprite的Draw函数和修改后的Draw函数就可以发现问题。
6、收获:通过查Bug的过程理解了shader的调用过程和shader的初级写法。