没想到原文出了那么多错别字,实在对不起观众了。介绍opengl es 2.0的不多。相信介绍基于Cocos2d-x学习OpenGL ES 2.0之多纹理的,我是独此一家吧。~~

子龙山人出了一个系列:基于Cocos2d-x学习OpenGL ES 2.0。弄c++来搞cocos2dx的可以看看。

教程是参考iphone的教程来写的,坑点也有不少,最主要的坑点还是在版本。所以还是弄个cocos2dx 3.2比较好。前两天辉辉说cocos2dx 3.2也很操蛋,.h里声明的返回值在源码实现的时候返回类型竟然变了。不得不吐槽一下~

子龙山人的教程只能教你照葫芦画瓢,什么原理的东西是压根就没涉及,有的还因为cocos2dx的封装过度会产生一些误导。

cocos2dx对opengl es封装的有点让人恶心,如果想学习opengl es是不建议在cocos2dx下进行学习的。

废话少说吧,开始正文。

根据子龙山人的教程,弄出了立方体纹理贴图,但是假如想在同一个面上贴多个纹理呢?该怎么实现?

本文提到两个方法,第一就是获取两个纹理,分别画图贴纹理,意思就是装顶点,装索引,绑定纹理,画图一。装顶点,装纹理,画图二。此时用到的都是GL_TEXTURE0,在frag文件中,只需要一个采样器就ok。

第二中方法就是用两个sampler,装顶点,装索引,绑定纹理一,绑定纹理二,画图。就OK了。

说起来比较简单,真要自己动手做,对于一个新手来说,过程还是有点小郁闷的。

下面就上源码了,对于步骤和方法的含义,此处不作介绍。相信强大的google和百度可以发挥巨大的作用。

第一种是立方体六个面贴上纹理,其中一个面再次贴上第二个纹理。

所用到的shader文件:

  1. attribute vec4 a_position; //
  2. attribute vec4 a_color; //
  3. attribute vec2 TextureCoord;
  4.  
  5. varying vec4 DestinationColor; //
  6. varying vec2 v_texCoord;
  7.  
  8. void main(void) { //
  9. DestinationColor = a_color; //
  10. v_texCoord = TextureCoord;
  11. gl_Position = CC_MVPMatrix * a_position; //
  12. }

myshader.vert

  1. varying vec4 DestinationColor; //
  2. varying vec2 v_texCoord;
  3.  
  4. void main(void) { //
  5.  
  6. gl_FragColor = DestinationColor * texture2D(CC_Texture0, v_texCoord) ; //
  7. }

myshader.frag

所用到的两张图

      

头文件:

  1. #ifndef _CubeTexture_H__
  2. #define _CubeTexture_H__
  3.  
  4. #include "cocos2d.h"
  5.  
  6. using namespace cocos2d;
  7.  
  8. class CubeTexture : 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(CubeTexture);
  23.  
  24. private:
  25. Mat4 _modelViewMV;
  26. CustomCommand _customCommand;
  27.  
  28. GLProgram *mShaderProgram;
  29. GLint _colorLocation;
  30. GLint _positionLocation;
  31. GLint _textureLocation;
  32.  
  33. GLuint _textureUniform;
  34.  
  35. GLuint _textureID;
  36. GLuint _textureID2;
  37.  
  38. GLuint vertexBuffer;
  39. GLuint indexBuffer;
  40.  
  41. GLuint _vertexBuffer2;
  42. GLuint _indexBuffer2;
  43.  
  44. };
  45.  
  46. #endif // __HELLOWORLD_SCENE_H__

CubeTexture.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( , &vertexBuffer );
  24. glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer );
  25.  
  26. glGenBuffers( , &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(,,), Vec3(,,), Vec3(,-,), &modelViewMatrix);
  52. modelViewMatrix.translate(, , );
  53.  
  54. static float rotation = ;
  55. modelViewMatrix.rotate(Vec3(,,),CC_DEGREES_TO_RADIANS(rotation));
  56.  
  57. Mat4 projectionMatrix;
  58. Mat4::createPerspective(, /, 1.0, , &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[];
  64. float Color[];
  65. float TexCoord[];
  66. } Vertex;
  67. #define TEX_COORD_MAX 1
  68.  
  69. Vertex Vertices[] = {
  70. // Front
  71. {{, -, }, {, , , }, {TEX_COORD_MAX, }},
  72. {{, , }, {, , , }, {TEX_COORD_MAX, TEX_COORD_MAX}},
  73. {{-, , }, {, , , }, {, TEX_COORD_MAX}},
  74. {{-, -, }, {, , , }, {, }},
  75. // Back
  76. {{, , -}, {, , , }, {TEX_COORD_MAX, }},
  77. {{-, -, -}, {, , , }, {TEX_COORD_MAX, TEX_COORD_MAX}},
  78. {{, -, -}, {, , , }, {, TEX_COORD_MAX}},
  79. {{-, , -}, {, , , }, {, }},
  80. // Left
  81. {{-, -, }, {, , , }, {TEX_COORD_MAX, }},
  82. {{-, , }, {, , , }, {TEX_COORD_MAX, TEX_COORD_MAX}},
  83. {{-, , -}, {, , , }, {, TEX_COORD_MAX}},
  84. {{-, -, -}, {, , , }, {, }},
  85. // Right
  86. {{, -, -}, {, , , }, {TEX_COORD_MAX, }},
  87. {{, , -}, {, , , }, {TEX_COORD_MAX, TEX_COORD_MAX}},
  88. {{, , }, {, , , }, {, TEX_COORD_MAX}},
  89. {{, -, }, {, , , }, {, }},
  90. // Top
  91. {{, , }, {, , , }, {TEX_COORD_MAX, }},
  92. {{, , -}, {, , , }, {TEX_COORD_MAX, TEX_COORD_MAX}},
  93. {{-, , -}, {, , , }, {, TEX_COORD_MAX}},
  94. {{-, , }, {, , , }, {, }},
  95. // Bottom
  96. {{, -, -}, {, , , }, {TEX_COORD_MAX, }},
  97. {{, -, }, {, , , }, {TEX_COORD_MAX, TEX_COORD_MAX}},
  98. {{-, -, }, {, , , }, {, TEX_COORD_MAX}},
  99. {{-, -, -}, {, , , }, {, }}
  100. };
  101. int vertexCount = sizeof(Vertices) / sizeof(Vertices[]);
  102.  
  103. GLubyte Indices[] = {
  104. // Front
  105. , , ,
  106. , , ,
  107. // Back
  108. , , ,
  109. , , ,
  110. // Left
  111. , , ,
  112. , , ,
  113. // Right
  114. , , ,
  115. , , ,
  116. // Top
  117. , , ,
  118. , , ,
  119. // Bottom
  120. , , ,
  121. , ,
  122. };
  123.  
  124. // 1) Add to top of file
  125. const Vertex Vertices2[] = {
  126. {{0.5, -0.5, 0.01}, {, , , }, {, }},
  127. {{0.5, 0.5, 0.01}, {, , , }, {, }},
  128. {{-0.5, 0.5, 0.01}, {, , , }, {, }},
  129. {{-0.5, -0.5, 0.01}, {, , , }, {, }},
  130. };
  131.  
  132. const GLubyte Indices2[] = {
  133. , , ,
  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. _positionLocation = glGetAttribLocation(mShaderProgram->getProgram(), "a_position");
  143. _colorLocation = glGetAttribLocation(mShaderProgram->getProgram(), "a_color");
  144.  
  145. _textureLocation = glGetAttribLocation(mShaderProgram->getProgram(), "TextureCoord");
  146. _textureUniform = glGetUniformLocation(mShaderProgram->getProgram(), "CC_Texture0");
  147.  
  148. mShaderProgram->use();
  149. mShaderProgram->setUniformsForBuiltins();
  150.  
  151. glEnableVertexAttribArray(_positionLocation);
  152. glEnableVertexAttribArray(_colorLocation);
  153. glEnableVertexAttribArray(_textureLocation);
  154.  
  155. glVertexAttribPointer(_positionLocation, , GL_FLOAT, GL_FALSE, sizeof(Vertex), (GLvoid*)offsetof(Vertex, Position));
  156.  
  157. glVertexAttribPointer(_colorLocation, , GL_FLOAT, GL_FALSE, sizeof(Vertex),(GLvoid*)offsetof(Vertex, Color));
  158.  
  159. glVertexAttribPointer(_textureLocation, , GL_FLOAT, GL_FALSE, sizeof(Vertex),
  160. (GLvoid*)offsetof(Vertex, TexCoord));
  161. //
  162. ////set sampler
  163. GL::bindTexture2DN(, _textureID);
  164. //glActiveTexture( GL_TEXTURE0 );
  165. //glBindTexture(GL_TEXTURE_2D, _textureID);
  166. glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
  167. glEnable(GL_BLEND);
  168. glEnable(GL_DEPTH_TEST);
  169. glDrawElements(GL_TRIANGLES, , GL_UNSIGNED_BYTE, );
  170. glUniform1i(_textureUniform, ); // unnecc in practice
  171.  
  172. glGenBuffers(, &_vertexBuffer2);
  173. glBindBuffer(GL_ARRAY_BUFFER, _vertexBuffer2);
  174. glBufferData(GL_ARRAY_BUFFER, sizeof(Vertices2), Vertices2, GL_STATIC_DRAW);
  175.  
  176. glGenBuffers(, &_indexBuffer2);
  177. glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, _indexBuffer2);
  178. glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(Indices2), Indices2, GL_STATIC_DRAW);
  179.  
  180. glBindBuffer(GL_ARRAY_BUFFER, _vertexBuffer2);
  181. glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, _indexBuffer2);
  182.  
  183. GL::bindTexture2DN(, _textureID2);
  184. glUniform1i(_textureUniform, ); // unnecc in practice
  185.  
  186. glVertexAttribPointer(_positionLocation, , GL_FLOAT, GL_FALSE, sizeof(Vertex), );
  187. glVertexAttribPointer(_colorLocation, , GL_FLOAT, GL_FALSE, sizeof(Vertex), (GLvoid*) (sizeof(float) * ));
  188. glVertexAttribPointer(_textureLocation, , GL_FLOAT, GL_FALSE, sizeof(Vertex), (GLvoid*) (sizeof(float) * ));
  189.  
  190. glDrawElements(GL_TRIANGLE_STRIP, sizeof(Indices2)/sizeof(Indices2[]), GL_UNSIGNED_BYTE, );
  191.  
  192. CC_INCREMENT_GL_DRAWN_BATCHES_AND_VERTICES(,vertexCount);
  193.  
  194. CHECK_GL_ERROR_DEBUG();
  195. glDisable(GL_DEPTH_TEST);
  196.  
  197. Director::getInstance()->popMatrix(MATRIX_STACK_TYPE::MATRIX_STACK_PROJECTION);
  198. Director::getInstance()->popMatrix(MATRIX_STACK_TYPE::MATRIX_STACK_MODELVIEW);
  199. }

CubeTexture

运行结果:

方法二,所需要的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. }

multiTexture.vert

  1. precision mediump float;
  2. varying vec2 v_texCoord;
  3. //uniform sampler2D s_lightMap;
  4. //uniform sampler2D s_baseMap;
  5.  
  6. void main(void) {
  7. vec4 baseColor;
  8. vec4 lightColor;
  9. //baseColor = texture2D( s_baseMap, v_texCoord);
  10. //lightColor = texture2D( s_lightMap, v_texCoord );
  11. baseColor = texture2D( CC_Texture0, v_texCoord);
  12. lightColor = texture2D( CC_Texture1, v_texCoord );
  13. gl_FragColor = baseColor * ( lightColor + 0.25 );
  14. }

multiTexture

所需要的图

  

头文件

  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__

MultiTexture.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(, &VAO);
  23. glBindVertexArray(VAO);
  24.  
  25. glGenBuffers( , &vertexBuffer );
  26. glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer );
  27.  
  28. glGenBuffers( , &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[];
  54. float TexCoord[];
  55. } Vertex;
  56. #define TEX_COORD_MAX 1
  57.  
  58. Vertex Vertices[] = {
  59.  
  60. {{-0.5, 0.5, }, {, }},
  61. {{-0.5, -0.5, }, {, TEX_COORD_MAX}},
  62. {{0.5, -0.5, }, { TEX_COORD_MAX,TEX_COORD_MAX}},
  63. {{0.5, 0.5, }, {TEX_COORD_MAX, }},
  64.  
  65. };
  66. int vertexCount = sizeof(Vertices) / sizeof(Vertices[]);
  67.  
  68. GLubyte Indices[] = {
  69. , , ,
  70. , , ,
  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, , GL_FLOAT, GL_FALSE, sizeof(Vertex), (GLvoid*)offsetof(Vertex, Position));
  90. glVertexAttribPointer(_texCoordLoc, , 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(, _lightMapTexId);
  100. glUniform1i(_lightMapLoc, ); // unnecc in practice
  101.  
  102. GL::bindTexture2DN(, _baseMapTexId);
  103. glUniform1i(_baseMapLoc, ); // unnecc in practice
  104.  
  105. glDrawElements(GL_TRIANGLES,, GL_UNSIGNED_BYTE, );
  106.  
  107. glBindVertexArray();
  108. CC_INCREMENT_GL_DRAWN_BATCHES_AND_VERTICES(,);
  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. }

MultiTexture

运行效果:

第二种方法中,

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了。

基于Cocos2d-x学习OpenGL ES 2.0之多纹理的更多相关文章

  1. 基于Cocos2d-x学习OpenGL ES 2.0系列——纹理贴图(6)

    在上一篇文章中,我们介绍了如何绘制一个立方体,里面涉及的知识点有VBO(Vertex Buffer Object).IBO(Index Buffer Object)和MVP(Modile-View-P ...

  2. 基于Cocos2d-x学习OpenGL ES 2.0系列——使用VBO索引(4)

    在上一篇文章中,我们介绍了uniform和模型-视图-投影变换,相信大家对于OpenGL ES 2.0应该有一点感觉了.在这篇文章中,我们不再画三角形了,改为画四边形.下篇教程,我们就可以画立方体了, ...

  3. 基于Cocos2d-x学习OpenGL ES 2.0系列——你的第一个三角形(1)

    前言 在本系列教程中,我会以当下最流行的2D引擎Cocos2d-x为基础,介绍OpenGL ES 2.0的一些基本用法.本系列教程的宗旨是OpenGL扫盲,让大家在使用Cocos2d-x过程中,知其然 ...

  4. 基于Cocos2d-x学习OpenGL ES 2.0系列——OpenGL ES渲染之Shader准备(7)

    Cocos2d-x底层图形绘制是使用OpenGL ES协议的.OpenGL ES是什么呢? OpenGL ES(OpenGl for Embedded System)是OpenGL三维图形API的子集 ...

  5. 基于Cocos2d-x学习OpenGL ES 2.0系列——编写自己的shader(2)

    在上篇文章中,我给大家介绍了如何在Cocos2d-x里面绘制一个三角形,当时我们使用的是Cocos2d-x引擎自带的shader和一些辅助函数.在本文中,我将演示一下如何编写自己的shader,同时, ...

  6. 基于Cocos2d-x学习OpenGL ES 2.0系列——OpenGL ES渲染之LayerColor(8)

    在前面文章中讲述了Cocos2d-x引擎OpenGL渲染准备Shader方面,本文主要讲解使用LayerColor来讲述OpenGL的渲染过程. 1.LayerColor对象创建 添加LayerCol ...

  7. OpenGL ES 3.0之Texturing纹理详解(一)

    本文流程 1.Texturing基础 2.装载Texturing和mipmapping 3.纹理过滤和包装 4.Texture level-of-detail, swizzles, and depth ...

  8. OpenGL ES 3.0之Texturing纹理详解(二)

    Texture Filtering and Mipmapping 纹理过滤与多级纹理 前面我们已经讲了单个2D图像的2D纹理的介绍,这篇文章主要讲解多级纹理.纹理坐标是用于生成一个2D索引,当放大和缩 ...

  9. 基于Cocos2d-x学习OpenGL ES 2.0系列——你的第一个立方体(5)

    在上篇文章中,我们介绍了VBO索引的使用,使用VBO索引可以有效地减少顶点个数,优化内存,提高程序效率. 本教程将带领大家一起走进3D--绘制一个立方体.其实画立方体本质上和画三角形没什么区别,所有的 ...

随机推荐

  1. 解决 /dev/mapper/* 100%

    1.查看大文件位置du -sh /* | sort -nr 2.分析,处理文件

  2. eclipse 图片预览插件

      eclipse 图片预览插件 CreateTime--2018年4月22日22:59:55 Author:Marydon 下载地址:eclipse 图片预览插件 将插件文件夹直接拷贝到eclips ...

  3. raise语句

    # -*- coding: utf-8 -*- #python 27 #xiaodeng #Python学习手册 868 #raise语句 res=[IndexError,TypeError] #ra ...

  4. spring aop的两种写法aspect和advisor

    本文转自:https://www.cnblogs.com/leiOOlei/p/3709607.html 首先看个例子,如下 接口代码: package com.lei.demo.aop.schema ...

  5. Linux安装SQLite轻量级数据库

    SQLite,是一款轻型的数据库,是遵守ACID的关系型数据库管理系统,它包含在一个相对小的C库中.它是D.RichardHipp建立的公有领域项目.它的设计目标是嵌入式的,而且目前已经在很多嵌入式产 ...

  6. Xiuno BBS 3.0 轻论坛程序正式版发布。

    github:git clone -b v3.0 https://git.oschina.net/xiuno/xiunobbs 安装包:http://bbs.xiuno.com/down/xiuno_ ...

  7. PHP-FastCGI详解

    一.什么是 FastCGI FastCGI是一个可伸缩地.高速地在HTTP server和动态脚本语言间通信的接口.多数流行的HTTP server都支持FastCGI,包括Apache.Nginx和 ...

  8. PHP-手册阅读笔记

    1.第一次遇到$_ENV为空数组的情况, 原来是PHP.INI中variables_order为'GPCS'(表示系统在定义PHP预定义变量时的顺序是GET,POST,COOKIES,SERVER,只 ...

  9. [转载]SVN权限设置具体实例

    原文地址:SVN权限设置具体实例作者:白菜豆腐 1   背景假设 厦门央瞬公司是一家电子元器件设备供应商,其中有个ARM部门,专门负责ARM芯片的方案设计.销售,并在北京.上海各设立了一个办事处.对于 ...

  10. SSL原理

    http://blog.csdn.net/terryzero/article/details/5921791SSL的原理以前一直很模糊,看了下面这篇文章后清楚了许多,为了方便以后的回顾,所以转载下 R ...