Cocos2d-x使用CCGLProgram和Shader文件实现精灵置灰
2017-06-11 09:20
483 查看
1. 实现方法:
CCGraySprite继承自
CCSprite覆盖
initWithTexture和
draw方法实现置灰。
方法和属性声明:
class CCGraySprite : public CCSprite{ public: CCGraySprite(); virtual ~CCGraySprite(); static CCGraySprite* create(const char* pszFileName); bool initWithTexture(CCTexture2D* pTexture, const CCRect& tRect); static CCGraySprite* createWithSprite(CCSprite *pSprite); static CCGraySprite* createWithNodeAndItChild(CCNode *pNode); void setGray(bool isGray); virtual void draw(); private: bool m_isGray; CCGLProgram* pProgram; };
m_isGray是否置灰
pProgram保存置灰的GL程序
2. shader字符串:
可以像官方那样写在一个.h文件中GLchar* pszFragSource = (GLchar*) "#ifdef GL_ES \n \ precision mediump float; \n \ #endif \n \ uniform sampler2D u_texture; \n \ varying vec2 v_texCoord; \n \ varying vec4 v_fragmentColor; \n \ void main(void) \n \ { \n \ // Convert to greyscale using NTSC weightings \n \ vec4 col = texture2D(u_texture, v_texCoord); \n \ float grey = dot(col.rgb, vec3(0.299, 0.587, 0.114)); \n \ gl_FragColor = vec4(grey, grey, grey, col.a); \n \ }";
3. 核心代码:
覆盖父类的initWithTexture和
draw方法,根据
m_isGray调用对应GL程序进行渲染绘制精灵
void CCGraySprite::setGray(bool isGray) {
m_isGray = isGray;
if (isGray == true) {
this->setShaderProgram(pProgram);
}else
{
this->setShaderProgram(CCShaderCache::sharedShaderCache()->programForKey(kCCShader_PositionTextureColor));
}
}
bool CCGraySprite::initWithTexture(CCTexture2D* pTexture, const CCRect& tRect ){
m_isGray = true;
do{
CC_BREAK_IF(!CCSprite::initWithTexture(pTexture, tRect));
GLchar* pszFragSource = (GLchar*) "#ifdef GL_ES \n \ precision mediump float; \n \ #endif \n \ uniform sampler2D u_texture; \n \ varying vec2 v_texCoord; \n \ varying vec4 v_fragmentColor; \n \ void main(void) \n \ { \n \ // Convert to greyscale using NTSC weightings \n \ vec4 col = texture2D(u_texture, v_texCoord); \n \ float grey = dot(col.rgb, vec3(0.299, 0.587, 0.114)); \n \ gl_FragColor = vec4(grey, grey, grey, col.a); \n \ }";
pProgram = new CCGLProgram();
pProgram->initWithVertexShaderByteArray(ccPositionTextureColor_vert, pszFragSource);
this->setShaderProgram(pProgram);
CHECK_GL_ERROR_DEBUG();
this->getShaderProgram()->addAttribute(kCCAttributeNamePosition, kCCVertexAttrib_Position);
this->getShaderProgram()->addAttribute(kCCAttributeNameColor, kCCVertexAttrib_Color);
this->getShaderProgram()->addAttribute(kCCAttributeNameTexCoord, kCCVertexAttrib_TexCoords);
CHECK_GL_ERROR_DEBUG();
this->getShaderProgram()->link();
CHECK_GL_ERROR_DEBUG();
this->getShaderProgram()->updateUniforms();
CHECK_GL_ERROR_DEBUG();
return true;
} while (0);
return false;
}
void CCGraySprite::draw(){
if (this->getTexture() == NULL) {
return;
}
if(m_isGray == false){
CCSprite::draw();
return;
}
ccGLEnableVertexAttribs(kCCVertexAttribFlag_PosColorTex );
ccGLBlendFunc( m_sBlendFunc.src, m_sBlendFunc.dst );
this->getShaderProgram()->use();
this->getShaderProgram()->setUniformsForBuiltins();
ccGLBindTexture2D( this->getTexture()->getName() );
#define kQuadSize sizeof(m_sQuad.bl)
long offset = (long)&m_sQuad;
// vertex
int diff = offsetof( ccV3F_C4B_T2F, vertices);
glVertexAttribPointer(kCCVertexAttrib_Position, 3, GL_FLOAT, GL_FALSE, kQuadSize, (void*) (offset + diff));
// texCoods
diff = offsetof( ccV3F_C4B_T2F, texCoords);
glVertexAttribPointer(kCCVertexAttrib_TexCoords, 2, GL_FLOAT, GL_FALSE, kQuadSize, (void*)(offset + diff));
// color
diff = offsetof( ccV3F_C4B_T2F, colors);
glVertexAttribPointer(kCCVertexAttrib_Color, 4, GL_UNSIGNED_BYTE, GL_TRUE, kQuadSize, (void*)(offset + diff));
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
CC_INCREMENT_GL_DRAWS(1);
}
4. lua使用示例
需手写.pkg文件,使用tolua++工具导出Lua binding文件,在AppDelegate::applicationDidFinishLaunching()注册后,方可在lua层使用local nameBgSp = CCGraySprite:create("images/namebg.png")
local normalSp = CCSprite:create("images/namebg.png") local graySp = CCGraySprite:createWithNodeAndItChild(normalSp)
local frameSp = CCGraySprite:create("images/frame.png") frameSp:setGray(isGray)
查看原文:http://www.51xyyx.com/3195.html
相关文章推荐
- 通过cocos2d-x的CCGLProgram和CCShaderCache的实现来分析OpenGL
- 通过cocos2d-x的CCGLProgram和CCShaderCache的实现来分析OpenGL ES中的Shader编程
- 通过cocos2d-x的CCGLProgram和CCShaderCache的实现来分析OpenGL ES中的Shader编程
- 在 cocos2d-x 3.x中使用shader实现精灵色相(Hue)的修改
- cocos2d-实现读取.plist文件(使用数组CCArray)
- 学习笔记之cocos2d-x2.1.1实现读取.plist文件(使用数组CCArray)
- 学习笔记之cocos2d-x2.1.1实现读取.plist文件(使用数组CCArray)
- 【cocos2d-x 2.x 学习与应用总结】13: 借助CCGLProgram实现自定义绘制
- cocos2d-实现读取.plist文件(使用数组CCArray)
- cocos2d-x使用TexturePacker打包图片及使用生成的plist文件创建精灵动画
- cocos2d plist文件使用(在一张大图中放置多个精灵图片)
- cocos2d-x笔记-CCGLProgram
- Cocos2d-X中使用CCHttpClient实现网络通信
- Cocos2d-js 使用cc.Animation实现跑酷
- cocos2dx 2.1.4 shader解析2-CCGLProgram分析
- 【cocos2d-x 2.x 学习与应用总结】11: 理解CCGLProgram
- 在 cocos2d-x 中使用多组shader实现多重滤镜
- cocos2d-x使用CCClippingNode实现跑马灯
- cocos2d-x使用TexturePacker打包图片及使用生成的plist文件创建精灵动画
- 在 cocos2d-x 中使用 libcurl 实现上传文件功能(附quick-cocos2d-x封装)