cocos2dx shader實現灰階圖android後台切換回來導致映像位移的問題

來源:互聯網
上載者:User

標籤:android   style   blog   http   io   color   os   ar   java   

轉自:http://www.tuicool.com/articles/U3URRrI

項目中經常會遇到將一張影像處理成灰色的需求,為了節省資源,一般不會讓美術再做一套同樣的灰階圖,通常會通過代碼處理讓圖片變灰。網上也有很多用shader處理圖片變灰的方法,這些方法確實也實現了讓圖片變灰的需求,但是android平台從後台切換回來的時候,shader被釋放,導致圖片位置錯亂。關鍵在於從android後台切換回來的時候需要重新載入shader。我們看一下cocos2dx原生的shader處理方式,我們從cocos2dx庫中找到CCShaderCache.cpp,發現這個類有個reloadDefaultShaders方法,這個方法是重新載入shader,但它在ios平台沒被調用,而在android平台,jni/main.cpp中被調用了,我們看一下main.cpp:

void Java_org_cocos2dx_lib_Cocos2dxRenderer_nativeInit(JNIEnv*  env, jobject thiz, jint w, jint h){  if (!CCDirector::sharedDirector()->getOpenGLView())  {    CCEGLView *view = CCEGLView::sharedOpenGLView();
    view->setFrameSize(w, h);    AppDelegate *pAppDelegate = new AppDelegate();    CCApplication::sharedApplication()->run();  }else{    ccGLInvalidateStateCache();    CCShaderCache::sharedShaderCache()->reloadDefaultShaders();    ccDrawInit();    CCTextureCache::reloadAllTextures();    CCNotificationCenter::sharedNotificationCenter()->postNotification(EVENT_COME_TO_FOREGROUND, NULL);    CCDirector::sharedDirector()->setGLDefaultValues();   }}
CCShaderCache::sharedShaderCache()->reloadDefaultShaders();這一行代碼就是重新載入shader。好了,問題找到了,只要我們在這個地方重新init一下shader就ok了。我將網上一種可行的處理方式粘貼到下面,給大家參考: 1、寫好一個映像變灰的shader程式,並放入到cocos2dx引擎下面的shader檔案夾中。
//ccShader_PositionTextureGray_frag.h"                                           \n\#ifdef GL_ES                                \nprecision mediump float;                    \n#endif                                      \n\\nuniform sampler2D u_texture;                \nvarying vec2 v_texCoord;                    \nvarying vec4 v_fragmentColor;               \n\nvoid main(void)                             \n{                                           \n// Convert to greyscale using NTSC weightings               \n\vec4 col = texture2D(u_texture, v_texCoord);                \nfloat grey = dot(col.rgb, vec3(0.299, 0.587, 0.114));       \ngl_FragColor = vec4(grey, grey, grey, col.a);               \n}                                           \n";

2、     ccShaders.h中添加

extern CC_DLL const GLchar * ccPositionTextureGray_frag;

3、ccShaders.cpp中添加

const GLchar * ccPositionTextureGray_frag =#include "ccShader_PositionTextureGray_frag.h"

4、CCGLProgram.h中添加

#define kCCShader_PositionTextureGray  "ShaderPositionTextureGray"

5、CCShaderCache.cpp中添加枚舉類型

enum {    kCCShaderType_PositionTextureColor,    kCCShaderType_PositionTextureColorAlphaTest,    kCCShaderType_PositionColor,    kCCShaderType_PositionTexture,    kCCShaderType_PositionTexture_uColor,    kCCShaderType_PositionTextureA8Color,    kCCShaderType_Position_uColor,    kCCShaderType_PositionLengthTexureColor,    kCCShaderType_ControlSwitch,        kCCShaderType_MAX,    kCCShaderType_PositionTextureGray,};

CCShaderCache::loadDefaultShaders()中添加

// Position Texture Gray shaderp = new CCGLProgram();loadDefaultShader(p, kCCShaderType_PositionTextureGray);m_pPrograms->setObject(p, kCCShader_PositionTextureGray);p->release();

CCShaderCache::reloadDefaultShaders()中添加

//// Position Texture Gray shader//p = programForKey(kCCShader_PositionTextureGray);p->reset();loadDefaultShader(p, kCCShaderType_PositionTextureGray);

CCShaderCache::loadDefaultShader(CCGLProgram *p, int type)中添加

case kCCShaderType_PositionTextureGray:       p->initWithVertexShaderByteArray(ccPositionTextureColor_vert, ccPositionTextureGray_frag);         p->addAttribute(kCCAttributeNamePosition, kCCVertexAttrib_Position);        p->addAttribute(kCCAttributeNameColor, kCCVertexAttrib_Color);        p->addAttribute(kCCAttributeNameTexCoord, kCCVertexAttrib_TexCoords);         break;

6、建立一個灰階轉換調用類(以便擴充其他的色彩轉換)

//ColorUtils.h#ifndef __COLOR_UTILS_H__#define __COLOR_UTILS_H__ #include "cocos2d.h"USING_NS_CC;class ColorUtils{public:    ColorUtils();    ~ColorUtils();     static void AddColorGray(CCSprite * spr);    static void RemoveColorGray(CCSprite * spr); private:};#endif//ColorUtils.cpp#include "ColorUtils.h" ColorUtils::ColorUtils(){} ColorUtils::~ColorUtils(){} void ColorUtils::AddColorGray(CCSprite * spr){    spr->setShaderProgram(CCShaderCache::sharedShaderCache()->programForKey(kCCShader_PositionTextureGray));} void ColorUtils::RemoveColorGray(CCSprite * spr){    spr->setShaderProgram(CCShaderCache::sharedShaderCache()->programForKey(kCCShader_PositionTextureColor));}

 

cocos2dx shader實現灰階圖android後台切換回來導致映像位移的問題

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.