将OpenGL代码从ES 1.0更改为ES 2.0后的错误

时间:2013-01-23 11:28:02

标签: opengl-es opengl-es-2.0 cocos2d-x

我在cocos2d-x

中将代码从ES 1.0更改为ES 2.0

ES 1.0版本中的代码

const float DARK=30.0f;
int n = m_sGridSize.x * m_sGridSize.y;
glEnable(GL_CULL_FACE);
glDisableClientState(GL_COLOR_ARRAY);   
glVertexPointer(3, GL_FLOAT, 0, m_pVertices);
glTexCoordPointer(2, GL_FLOAT, 0, m_pTexCoordinates);
glDrawElements(GL_TRIANGLES, (GLsizei) n*6, GL_UNSIGNED_SHORT, m_pIndices);
glFrontFace(GL_CW);
glDisable(GL_TEXTURE_2D);
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
glColor4ub(255-(m_AnimationProgress*DARK), 255-(m_AnimationProgress*DARK), 255-(m_AnimationProgress*DARK), 255);
glDrawElements(GL_TRIANGLES, (GLsizei) n*6, GL_UNSIGNED_SHORT, m_pIndices);
glColor4f(255, 255, 255, 255);
glFrontFace(GL_CCW);
glDisable(GL_CULL_FACE);
glEnable(GL_TEXTURE_2D);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glEnableClientState(GL_COLOR_ARRAY);

ES 2.0版本中的代码

const float DARK=30.0f;
m_pShaderProgram->use();
m_pShaderProgram->setUniformForModelViewProjectionMatrix();
int n = m_sGridSize.x * m_sGridSize.y;
glEnable(GL_CULL_FACE);
glDisableVertexAttribArray(kCCVertexAttrib_Color);
glVertexAttribPointer(kCCVertexAttrib_Position, 3, GL_FLOAT, GL_FALSE, 0, m_pVertices);
glVertexAttribPointer(kCCVertexAttrib_TexCoords, 2, GL_FLOAT, GL_FALSE, 0, m_pTexCoordinates);
glDrawElements(GL_TRIANGLES, (GLsizei) n*6, GL_UNSIGNED_SHORT, m_pIndices);
glFrontFace(GL_CW);
glDisable(GL_TEXTURE_2D);
glDisableVertexAttribArray(kCCVertexAttrib_TexCoords);
ccDrawColor4B(255-(m_AnimationProgress*DARK), 255-(m_AnimationProgress*DARK), 255-(m_AnimationProgress*DARK), 255);
glDrawElements(GL_TRIANGLES, (GLsizei) n*6, GL_UNSIGNED_SHORT, m_pIndices);
ccDrawColor4B(255, 255, 255, 255);
glFrontFace(GL_CCW);
glDisable(GL_CULL_FACE);
glEnable(GL_TEXTURE_2D);
glEnableVertexAttribArray(kCCVertexAttrib_TexCoords);
glEnableVertexAttribArray(kCCVertexAttrib_Color);

导致以下输出(XCode)

Cocos2d: OpenGL error 0x0500 in /cocos2dx/sprite_nodes/CCSprite.cpp draw 616

我做错了什么?我认为一切都很好,经过几次测试。

2 个答案:

答案 0 :(得分:2)

在OpenGL ES 1.1中,分别使用glEnableglDisable打开和关闭片段的纹理映射(ES 1.1中没有顶点纹理映射)。

在OpenGL ES 2.0中,片段纹理映射只有在编码到片段着色器中时才会完成,因此无需启用或禁用它。我怀疑GL_INVALID_ENUM来自剩余的glEnable(GL_TEXTURE_2D);glDisable(GL_TEXTURE_2D);。我猜你不止一次看到这个错误。

答案 1 :(得分:1)

0x0500是“非法枚举”错误。 Check the error codes here

这很可能是指GL_CULL_FACE或GL_TRIANGLES之类的枚举。请参阅DL ES参考,哪些可能在2.0中不可用,或在某些情况下不能使用哪些。