沒想到原文出了那麼多錯別字,實在對不起觀衆了。介紹opengl es 2.0的很少。相信介紹基於Cocos2d-x學習OpenGL ES 2.0之多紋理的,我是獨此一家吧。~~c++
子龍山人出了一個系列:基於Cocos2d-x學習OpenGL ES 2.0。弄c++來搞cocos2dx的能夠看看。iphone
教程是參考iphone的教程來寫的,坑點也有很多,最主要的坑點仍是在版本。因此仍是弄個cocos2dx 3.2比較好。前兩天輝輝說cocos2dx 3.2也很操蛋,.h裏聲明的返回值在源碼實現的時候返回類型居然變了。不得不吐槽一下~ide
子龍山人的教程只能教你照葫蘆畫瓢,什麼原理的東西是壓根就沒涉及,有的還由於cocos2dx的封裝過分會產生一些誤導。學習
cocos2dx對opengl es封裝的有點讓人噁心,若是想學習opengl es是不建議在cocos2dx下進行學習的。ui
廢話少說吧,開始正文。this
根據子龍山人的教程,弄出了立方體紋理貼圖,可是假如想在同一個面上貼多個紋理呢?該怎麼實現?google
本文提到兩個方法,第一就是獲取兩個紋理,分別畫圖貼紋理,意思就是裝頂點,裝索引,綁定紋理,畫圖一。裝頂點,裝紋理,畫圖二。此時用到的都是GL_TEXTURE0,在frag文件中,只須要一個採樣器就ok。spa
第二中方法就是用兩個sampler,裝頂點,裝索引,綁定紋理一,綁定紋理二,畫圖。就OK了。code
提及來比較簡單,真要本身動手作,對於一個新手來講,過程仍是有點小鬱悶的。orm
下面就上源碼了,對於步驟和方法的含義,此處不做介紹。相信強大的google和百度能夠發揮巨大的做用。
第一種是立方體六個面貼上紋理,其中一個面再次貼上第二個紋理。
所用到的shader文件:
1 attribute vec4 a_position; // 1 2 attribute vec4 a_color; // 2 3 attribute vec2 TextureCoord; 4 5 varying vec4 DestinationColor; // 3 6 varying vec2 v_texCoord; 7 8 9 void main(void) { // 4 10 DestinationColor = a_color; // 5 11 v_texCoord = TextureCoord; 12 gl_Position = CC_MVPMatrix * a_position; // 6 13 }
1 varying vec4 DestinationColor; // 1 2 varying vec2 v_texCoord; 3 4 void main(void) { // 2 5 6 gl_FragColor = DestinationColor * texture2D(CC_Texture0, v_texCoord) ; // 3 7 }
所用到的兩張圖
頭文件:
#ifndef _CubeTexture_H__ #define _CubeTexture_H__ #include "cocos2d.h" using namespace cocos2d; class CubeTexture : public cocos2d::Layer { public: // there's no 'id' in cpp, so we recommend returning the class instance pointer static cocos2d::Scene* createScene(); // Here's a difference. Method 'init' in cocos2d-x returns bool, instead of returning 'id' in cocos2d-iphone virtual bool init(); virtual void draw(Renderer *renderer, const Mat4 &transform, uint32_t transformUpdated) override; //we call our actual opengl commands here void onDraw(); // implement the "static create()" method manually CREATE_FUNC(CubeTexture); private: Mat4 _modelViewMV; CustomCommand _customCommand; GLProgram *mShaderProgram; GLint _colorLocation; GLint _positionLocation; GLint _textureLocation; GLuint _textureUniform; GLuint _textureID; GLuint _textureID2; GLuint vertexBuffer; GLuint indexBuffer; GLuint _vertexBuffer2; GLuint _indexBuffer2; }; #endif // __HELLOWORLD_SCENE_H__
1 #include "CubeTexture.h" 2 using namespace GL; 3 4 cocos2d::Scene* CubeTexture::createScene() 5 { 6 auto scene = Scene::create(); 7 auto layer = CubeTexture::create(); 8 scene->addChild(layer); 9 return scene; 10 } 11 12 bool CubeTexture::init() 13 { 14 if ( Layer::init() ) 15 { 16 mShaderProgram = new GLProgram; 17 mShaderProgram->initWithFilenames("myshader.vert","myshader.frag"); 18 mShaderProgram->link(); 19 mShaderProgram->updateUniforms(); 20 21 _textureID = Director::getInstance()->getTextureCache()->addImage( "HelloWorld.png" )->getName(); 22 _textureID2 = Director::getInstance()->getTextureCache()->addImage("item_powerup_fish.png")->getName(); 23 glGenBuffers( 1, &vertexBuffer ); 24 glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer ); 25 26 glGenBuffers( 1, &indexBuffer ); 27 glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexBuffer ); 28 29 return true; 30 } 31 return false; 32 } 33 34 void CubeTexture::draw( Renderer *renderer, const Mat4 &transform, uint32_t transformUpdated ) 35 { 36 Layer::draw(renderer, transform, transformUpdated); 37 38 _customCommand.init(_globalZOrder); 39 _customCommand.func = CC_CALLBACK_0(CubeTexture::onDraw,this); 40 renderer->addCommand(&_customCommand); 41 } 42 43 void CubeTexture::onDraw() 44 { 45 Director::getInstance()->pushMatrix(MATRIX_STACK_TYPE::MATRIX_STACK_MODELVIEW); 46 Director::getInstance()->loadIdentityMatrix(MATRIX_STACK_TYPE::MATRIX_STACK_MODELVIEW); 47 Director::getInstance()->pushMatrix(MATRIX_STACK_TYPE::MATRIX_STACK_PROJECTION); 48 Director::getInstance()->loadIdentityMatrix(MATRIX_STACK_TYPE::MATRIX_STACK_PROJECTION); 49 50 Mat4 modelViewMatrix; 51 Mat4::createLookAt(Vec3(0,0,5), Vec3(0,0,0), Vec3(0,-1,0), &modelViewMatrix); 52 modelViewMatrix.translate(0, 0,0 ); 53 54 static float rotation = 20; 55 modelViewMatrix.rotate(Vec3(0,1,0),CC_DEGREES_TO_RADIANS(rotation)); 56 57 Mat4 projectionMatrix; 58 Mat4::createPerspective(60, 480/320, 1.0, 42, &projectionMatrix); 59 Director::getInstance()->multiplyMatrix(MATRIX_STACK_TYPE::MATRIX_STACK_PROJECTION, projectionMatrix); 60 Director::getInstance()->multiplyMatrix(MATRIX_STACK_TYPE::MATRIX_STACK_MODELVIEW, modelViewMatrix); 61 62 typedef struct { 63 float Position[3]; 64 float Color[4]; 65 float TexCoord[2]; 66 } Vertex; 67 #define TEX_COORD_MAX 1 68 69 Vertex Vertices[] = { 70 // Front 71 {{1, -1, 0}, {1, 0, 0, 1}, {TEX_COORD_MAX, 0}}, 72 {{1, 1, 0}, {0, 1, 0, 1}, {TEX_COORD_MAX, TEX_COORD_MAX}}, 73 {{-1, 1, 0}, {0, 0, 1, 1}, {0, TEX_COORD_MAX}}, 74 {{-1, -1, 0}, {0, 0, 0, 1}, {0, 0}}, 75 // Back 76 {{1, 1, -2}, {1, 0, 0, 1}, {TEX_COORD_MAX, 0}}, 77 {{-1, -1, -2}, {0, 1, 0, 1}, {TEX_COORD_MAX, TEX_COORD_MAX}}, 78 {{1, -1, -2}, {0, 0, 1, 1}, {0, TEX_COORD_MAX}}, 79 {{-1, 1, -2}, {0, 0, 0, 1}, {0, 0}}, 80 // Left 81 {{-1, -1, 0}, {1, 0, 0, 1}, {TEX_COORD_MAX, 0}}, 82 {{-1, 1, 0}, {0, 1, 0, 1}, {TEX_COORD_MAX, TEX_COORD_MAX}}, 83 {{-1, 1, -2}, {0, 0, 1, 1}, {0, TEX_COORD_MAX}}, 84 {{-1, -1, -2}, {0, 0, 0, 1}, {0, 0}}, 85 // Right 86 {{1, -1, -2}, {1, 0, 0, 1}, {TEX_COORD_MAX, 0}}, 87 {{1, 1, -2}, {0, 1, 0, 1}, {TEX_COORD_MAX, TEX_COORD_MAX}}, 88 {{1, 1, 0}, {0, 0, 1, 1}, {0, TEX_COORD_MAX}}, 89 {{1, -1, 0}, {0, 0, 0, 1}, {0, 0}}, 90 // Top 91 {{1, 1, 0}, {1, 0, 0, 1}, {TEX_COORD_MAX, 0}}, 92 {{1, 1, -2}, {0, 1, 0, 1}, {TEX_COORD_MAX, TEX_COORD_MAX}}, 93 {{-1, 1, -2}, {0, 0, 1, 1}, {0, TEX_COORD_MAX}}, 94 {{-1, 1, 0}, {0, 0, 0, 1}, {0, 0}}, 95 // Bottom 96 {{1, -1, -2}, {1, 0, 0, 1}, {TEX_COORD_MAX, 0}}, 97 {{1, -1, 0}, {0, 1, 0, 1}, {TEX_COORD_MAX, TEX_COORD_MAX}}, 98 {{-1, -1, 0}, {0, 0, 1, 1}, {0, TEX_COORD_MAX}}, 99 {{-1, -1, -2}, {0, 0, 0, 1}, {0, 0}} 100 }; 101 int vertexCount = sizeof(Vertices) / sizeof(Vertices[0]); 102 103 GLubyte Indices[] = { 104 // Front 105 0, 1, 2, 106 2, 3, 0, 107 // Back 108 4, 5, 6, 109 4, 5, 7, 110 // Left 111 8, 9, 10, 112 10, 11, 8, 113 // Right 114 12, 13, 14, 115 14, 15, 12, 116 // Top 117 16, 17, 18, 118 18, 19, 16, 119 // Bottom 120 20, 21, 22, 121 22, 23, 20 122 }; 123 124 // 1) Add to top of file 125 const Vertex Vertices2[] = { 126 {{0.5, -0.5, 0.01}, {1, 1, 1, 1}, {1, 1}}, 127 {{0.5, 0.5, 0.01}, {1, 1, 1, 1}, {1, 0}}, 128 {{-0.5, 0.5, 0.01}, {1, 1, 1, 1}, {0, 0}}, 129 {{-0.5, -0.5, 0.01}, {1, 1, 1, 1}, {0, 1}}, 130 }; 131 132 const GLubyte Indices2[] = { 133 1, 0, 2, 3 134 }; 135 136 glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer); 137 glBufferData(GL_ARRAY_BUFFER,sizeof(Vertices),Vertices, GL_STATIC_DRAW); 138 139 glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexBuffer); 140 glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(Indices),Indices,GL_STATIC_DRAW); 141 142 143 _positionLocation = glGetAttribLocation(mShaderProgram->getProgram(), "a_position"); 144 _colorLocation = glGetAttribLocation(mShaderProgram->getProgram(), "a_color"); 145 146 _textureLocation = glGetAttribLocation(mShaderProgram->getProgram(), "TextureCoord"); 147 _textureUniform = glGetUniformLocation(mShaderProgram->getProgram(), "CC_Texture0"); 148 149 mShaderProgram->use(); 150 mShaderProgram->setUniformsForBuiltins(); 151 152 glEnableVertexAttribArray(_positionLocation); 153 glEnableVertexAttribArray(_colorLocation); 154 glEnableVertexAttribArray(_textureLocation); 155 156 glVertexAttribPointer(_positionLocation, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), (GLvoid*)offsetof(Vertex, Position)); 157 158 glVertexAttribPointer(_colorLocation, 4, GL_FLOAT, GL_FALSE, sizeof(Vertex),(GLvoid*)offsetof(Vertex, Color)); 159 160 glVertexAttribPointer(_textureLocation, 2, GL_FLOAT, GL_FALSE, sizeof(Vertex), 161 (GLvoid*)offsetof(Vertex, TexCoord)); 162 // 163 ////set sampler 164 GL::bindTexture2DN(0, _textureID); 165 //glActiveTexture( GL_TEXTURE0 ); 166 //glBindTexture(GL_TEXTURE_2D, _textureID); 167 glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA); 168 glEnable(GL_BLEND); 169 glEnable(GL_DEPTH_TEST); 170 glDrawElements(GL_TRIANGLES, 36, GL_UNSIGNED_BYTE, 0); 171 glUniform1i(_textureUniform, 0); // unnecc in practice 172 173 glGenBuffers(1, &_vertexBuffer2); 174 glBindBuffer(GL_ARRAY_BUFFER, _vertexBuffer2); 175 glBufferData(GL_ARRAY_BUFFER, sizeof(Vertices2), Vertices2, GL_STATIC_DRAW); 176 177 glGenBuffers(1, &_indexBuffer2); 178 glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, _indexBuffer2); 179 glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(Indices2), Indices2, GL_STATIC_DRAW); 180 181 glBindBuffer(GL_ARRAY_BUFFER, _vertexBuffer2); 182 glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, _indexBuffer2); 183 184 GL::bindTexture2DN(0, _textureID2); 185 glUniform1i(_textureUniform, 0); // unnecc in practice 186 187 glVertexAttribPointer(_positionLocation, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), 0); 188 glVertexAttribPointer(_colorLocation, 4, GL_FLOAT, GL_FALSE, sizeof(Vertex), (GLvoid*) (sizeof(float) * 3)); 189 glVertexAttribPointer(_textureLocation, 2, GL_FLOAT, GL_FALSE, sizeof(Vertex), (GLvoid*) (sizeof(float) * 7)); 190 191 glDrawElements(GL_TRIANGLE_STRIP, sizeof(Indices2)/sizeof(Indices2[0]), GL_UNSIGNED_BYTE, 0); 192 193 CC_INCREMENT_GL_DRAWN_BATCHES_AND_VERTICES(1,vertexCount); 194 195 CHECK_GL_ERROR_DEBUG(); 196 glDisable(GL_DEPTH_TEST); 197 198 Director::getInstance()->popMatrix(MATRIX_STACK_TYPE::MATRIX_STACK_PROJECTION); 199 Director::getInstance()->popMatrix(MATRIX_STACK_TYPE::MATRIX_STACK_MODELVIEW); 200 }
運行結果:
方法二,所須要的shader文件:
1 attribute vec4 a_position; 2 attribute vec2 a_texCoord; 3 4 varying vec2 v_texCoord; 5 6 void main(void) { 7 gl_Position = CC_MVPMatrix * a_position; 8 v_texCoord = a_texCoord; 9 }
1 precision mediump float; 2 varying vec2 v_texCoord; 3 //uniform sampler2D s_lightMap; 4 //uniform sampler2D s_baseMap; 5 6 7 void main(void) { 8 vec4 baseColor; 9 vec4 lightColor; 10 //baseColor = texture2D( s_baseMap, v_texCoord); 11 //lightColor = texture2D( s_lightMap, v_texCoord ); 12 baseColor = texture2D( CC_Texture0, v_texCoord); 13 lightColor = texture2D( CC_Texture1, v_texCoord ); 14 gl_FragColor = baseColor * ( lightColor + 0.25 ); 15 }
所須要的圖
頭文件
1 #ifndef _MultiTexture_H__ 2 #define _MultiTexture_H__ 3 4 #include "cocos2d.h" 5 6 using namespace cocos2d; 7 8 class MultiTexture : public cocos2d::Layer 9 { 10 public: 11 // there's no 'id' in cpp, so we recommend returning the class instance pointer 12 static cocos2d::Scene* createScene(); 13 14 // Here's a difference. Method 'init' in cocos2d-x returns bool, instead of returning 'id' in cocos2d-iphone 15 virtual bool init(); 16 17 virtual void draw(Renderer *renderer, const Mat4 &transform, uint32_t transformUpdated) override; 18 //we call our actual opengl commands here 19 void onDraw(); 20 21 // implement the "static create()" method manually 22 CREATE_FUNC(MultiTexture); 23 24 private: 25 Mat4 _modelViewMV; 26 CustomCommand _customCommand; 27 28 GLProgram *mShaderProgram; 29 // attribute locations 30 GLint _positionLoc; 31 GLint _texCoordLoc; 32 33 // sampler locations 34 GLuint _baseMapLoc; 35 GLuint _lightMapLoc; 36 // Texture handle 37 GLuint _baseMapTexId; 38 GLuint _lightMapTexId; 39 40 GLuint VAO; 41 GLuint vertexBuffer; 42 GLuint indexBuffer; 43 44 }; 45 46 #endif // __HELLOWORLD_SCENE_H__
源文件
1 #include "MultiTexture.h" 2 3 cocos2d::Scene* MultiTexture::createScene() 4 { 5 auto scene = Scene::create(); 6 auto layer = MultiTexture::create(); 7 scene->addChild(layer); 8 return scene; 9 } 10 11 bool MultiTexture::init() 12 { 13 if ( Layer::init() ) 14 { 15 mShaderProgram = new GLProgram; 16 mShaderProgram->initWithFilenames("multiTexture.vert","multiTexture.frag"); 17 mShaderProgram->link(); 18 mShaderProgram->updateUniforms(); 19 20 _baseMapTexId = Director::getInstance()->getTextureCache()->addImage( "HelloWorld.png" )->getName(); 21 _lightMapTexId = Director::getInstance()->getTextureCache()->addImage("crate.jpg")->getName(); 22 glGenVertexArrays(1, &VAO); 23 glBindVertexArray(VAO); 24 25 glGenBuffers( 1, &vertexBuffer ); 26 glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer ); 27 28 glGenBuffers( 1, &indexBuffer ); 29 glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexBuffer ); 30 31 return true; 32 } 33 return false; 34 } 35 36 void MultiTexture::draw( Renderer *renderer, const Mat4 &transform, uint32_t transformUpdated ) 37 { 38 Layer::draw(renderer, transform, transformUpdated); 39 40 _customCommand.init(_globalZOrder); 41 _customCommand.func = CC_CALLBACK_0(MultiTexture::onDraw,this); 42 renderer->addCommand(&_customCommand); 43 } 44 45 void MultiTexture::onDraw() 46 { 47 Director::getInstance()->pushMatrix(MATRIX_STACK_TYPE::MATRIX_STACK_MODELVIEW); 48 Director::getInstance()->loadIdentityMatrix(MATRIX_STACK_TYPE::MATRIX_STACK_MODELVIEW); 49 Director::getInstance()->pushMatrix(MATRIX_STACK_TYPE::MATRIX_STACK_PROJECTION); 50 Director::getInstance()->loadIdentityMatrix(MATRIX_STACK_TYPE::MATRIX_STACK_PROJECTION); 51 52 typedef struct { 53 float Position[3]; 54 float TexCoord[2]; 55 } Vertex; 56 #define TEX_COORD_MAX 1 57 58 Vertex Vertices[] = { 59 60 {{-0.5, 0.5, 0}, {0, 0}}, 61 {{-0.5, -0.5, 0}, {0, TEX_COORD_MAX}}, 62 {{0.5, -0.5, 0}, { TEX_COORD_MAX,TEX_COORD_MAX}}, 63 {{0.5, 0.5, 0}, {TEX_COORD_MAX, 0}}, 64 65 }; 66 int vertexCount = sizeof(Vertices) / sizeof(Vertices[0]); 67 68 GLubyte Indices[] = { 69 0, 1, 2, 70 2, 3, 0, 71 }; 72 73 glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer); 74 glBufferData(GL_ARRAY_BUFFER,sizeof(Vertices),Vertices, GL_STATIC_DRAW); 75 76 glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexBuffer); 77 glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(Indices),Indices,GL_STATIC_DRAW); 78 79 _positionLoc = glGetAttribLocation(mShaderProgram->getProgram(), "a_position"); 80 _texCoordLoc = glGetAttribLocation(mShaderProgram->getProgram(), "a_texCoord"); 81 //_baseMapLoc = glGetUniformLocation(mShaderProgram->getProgram(), "s_baseMap"); 82 //_lightMapLoc = glGetUniformLocation(mShaderProgram->getProgram(), "s_lightMap"); 83 _baseMapLoc = glGetUniformLocation(mShaderProgram->getProgram(), "CC_Texture0"); 84 _lightMapLoc = glGetUniformLocation(mShaderProgram->getProgram(), "CC_Texture1"); 85 86 glEnableVertexAttribArray(_positionLoc); 87 glEnableVertexAttribArray(_texCoordLoc); 88 89 glVertexAttribPointer(_positionLoc, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), (GLvoid*)offsetof(Vertex, Position)); 90 glVertexAttribPointer(_texCoordLoc, 2, GL_FLOAT, GL_FALSE, sizeof(Vertex), 91 (GLvoid*)offsetof(Vertex, TexCoord)); 92 93 mShaderProgram->use(); 94 mShaderProgram->setUniformsForBuiltins(); 95 96 glEnable(GL_DEPTH_TEST); 97 glBindVertexArray(VAO); 98 99 GL::bindTexture2DN(0, _lightMapTexId); 100 glUniform1i(_lightMapLoc, 0 ); // unnecc in practice 101 102 GL::bindTexture2DN(1, _baseMapTexId); 103 glUniform1i(_baseMapLoc, 1); // unnecc in practice 104 105 glDrawElements(GL_TRIANGLES,6, GL_UNSIGNED_BYTE, 0 ); 106 107 glBindVertexArray(0); 108 CC_INCREMENT_GL_DRAWN_BATCHES_AND_VERTICES(1,6); 109 110 CHECK_GL_ERROR_DEBUG(); 111 glDisable(GL_DEPTH_TEST); 112 113 Director::getInstance()->popMatrix(MATRIX_STACK_TYPE::MATRIX_STACK_PROJECTION); 114 Director::getInstance()->popMatrix(MATRIX_STACK_TYPE::MATRIX_STACK_MODELVIEW); 115 }
運行效果:
第二種方法中,
cpp內的:
//_baseMapLoc = glGetUniformLocation(mShaderProgram->getProgram(), "s_baseMap");
//_lightMapLoc = glGetUniformLocation(mShaderProgram->getProgram(), "s_lightMap");
_baseMapLoc = glGetUniformLocation(mShaderProgram->getProgram(), "CC_Texture0");
_lightMapLoc = glGetUniformLocation(mShaderProgram->getProgram(), "CC_Texture1");
和shader內的
//baseColor = texture2D( s_baseMap, v_texCoord);
//lightColor = texture2D( s_lightMap, v_texCoord );
baseColor = texture2D( CC_Texture0, v_texCoord);
lightColor = texture2D( CC_Texture1, v_texCoord );
將註釋解開,把下面兩行注掉。一樣能夠。這說明了,cocos2dx在進行編譯shader的時候內置了多個uniform值。你們能夠看一下,其中就包括CC_Texture0系列。
其實用起來不算方便了,而不注意的人,可能會聲明和內置變量相同的名字,此時,咳咳咳咳咳~ shader編譯的時候就會出錯了。不知道爲啥cocos2dx要屢次一舉。
還有一點:
////set sampler
GL::bindTexture2DN(0, _textureID);
//glActiveTexture( GL_TEXTURE0 );
//glBindTexture(GL_TEXTURE_2D, _textureID);
我使用了GL::bindTexture2DN 方法,而並無使用opengl es原裝的 glActiveTexture 和glBindTexture這兩個方法。其實GL::bindTexture2DN 內部就調用了後面的兩個方法,那爲什麼不直接用後面的兩個方法呢?
緣由是,直接用opengl es的方法,會出錯!!!尼瑪 這纔是坑點。跟蹤後發現,cocos2dx給GL相關的東西添加了一個StateCache的東西,當activeTexture時,須要更改cache內的東西。直接調用glActiveTexture的方法,就略去了往cache內塞東西的步驟,這樣就出錯了。
猜想是cocos2dx進行渲染的時候,調用了cache內的什麼東西。尼瑪,你還能封裝的再噁心一點麼?
因此說,不喜歡cocos2dx這種處理問題的方法的,能夠徹底拋開cocos2dx了。