解决了困扰一整天的纹理颜色设置的问题

来源:互联网 发布:java求最小公倍数算法 编辑:程序博客网 时间:2024/04/27 15:22

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) {        m_pShaderProgram->use();        m_pShaderProgram->setUniformsForBuiltins();    }
     d、把颜色值传入:  glVertexAttribPointer(kCCVertexAttrib_Color, 4, GL_UNSIGNED_BYTE, GL_TRUE, 0, colors);

可见,opengles2.0之后,万事万物皆shader,设置纹理颜色本质上还是通过shader来完成的。


3、最开始出现的bug:  纹理颜色不正确,并且文字毛边很严重,怎么修改shader都不对。

4、Bug出现的原因: 没有理解 glVertexAttribPointer第四个参数的含义,colors是CLByte类型,但是这个参数传递的又是GL_FALSE,修改为GL_TRUE后正常。

5、反思:其实可以更快的找到问题,因为生产字形的过程跟原来一模一样,所以只要仔细比对下CCSprite的Draw函数和修改后的Draw函数就可以发现问题。

6、收获:通过查Bug的过程理解了shader的调用过程和shader的初级写法。

原创粉丝点击