cocos2dx 3.x版本 Sprite 灰度和彩色切换,无偏移

前端之家收集整理的这篇文章主要介绍了cocos2dx 3.x版本 Sprite 灰度和彩色切换,无偏移前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

我从cocos2dx 3.x开始研究的,发现网上有很多在2.x变灰的例子,甚至需要改源码,而我个人偏向于静态方法的封装的用法,所以整合总结并测试了如下方法。在cocos2dx 3.4版本通过,关于偏移问题确实恶心,查阅很多博文已解决,有了这个方法我就准备在下一篇实现一个技能CD效果的通用方案。

  1. static void SwitchGray (Sprite *sp,bool isGray)
  2. {
  3. GLchar* grayvsh =
  4. "attribute vec4 a_position; \n \
  5. attribute vec2 a_texCoord; \n \
  6. attribute vec4 a_color; \n \
  7. varying vec4 v_fragmentColor;\n \
  8. varying vec2 v_texCoord;\n \
  9. void main(void) \n \
  10. { \n \
  11. gl_Position = CC_PMatrix * a_position;\n \
  12. v_fragmentColor = a_color;\n \
  13. v_texCoord = a_texCoord;\n \
  14. }";
  15. if(isGray)
  16. {
  17. GLchar* grayfsh=
  18. "varying vec4 v_fragmentColor;\n \
  19. varying vec2 v_texCoord;\n \
  20. void main()\n \
  21. {\n \
  22. vec4 v_orColor = v_fragmentColor * texture2D(CC_Texture0,v_texCoord);\n \
  23. float gray = dot(v_orColor.rgb,vec3(0.299,0.587,0.114));\n \
  24. gl_FragColor = vec4(gray,gray,v_orColor.a);\n \
  25. }";
  26. GLProgram* pProgram = new GLProgram();
  27. pProgram->initWithVertexShaderByteArray(grayvsh,grayfsh);
  28. sp->setShaderProgram(pProgram);
  29. pProgram->release();
  30. CHECK_GL_ERROR_DEBUG();
  31. } else {
  32. GLProgram* pProgram = new GLProgram();
  33. //pProgram->initWithFilenames("gray.vsh","color.fsh");
  34. pProgram->initWithVertexShaderByteArray(grayvsh,ccPositionTextureColor_frag);
  35. sp->setShaderProgram(pProgram);
  36. pProgram->release();
  37. CHECK_GL_ERROR_DEBUG();
  38. }
  39. sp->getShaderProgram()->addAttribute(GLProgram::ATTRIBUTE_NAME_POSITION,kCCVertexAttribFlag_Position);
  40. sp->getShaderProgram()->addAttribute(GLProgram::ATTRIBUTE_NAME_POSITION,kCCVertexAttrib_Position);
  41. sp->getShaderProgram()->addAttribute(GLProgram::ATTRIBUTE_NAME_COLOR,kCCVertexAttrib_Color);
  42. sp->getShaderProgram()->addAttribute(GLProgram::ATTRIBUTE_NAME_TEX_COORD,kCCVertexAttrib_TexCoords);
  43. CHECK_GL_ERROR_DEBUG();
  44. sp->getShaderProgram()->link();
  45. CHECK_GL_ERROR_DEBUG();
  46. sp->getShaderProgram()->updateUniforms();
  47. CHECK_GL_ERROR_DEBUG();
  48. }

猜你在找的Cocos2d-x相关文章