glDrawArrays时EXC_BAD_ACCESS

在学习OpenGL的过程中(http://4gamers.cn/blog/2014/05/31/opengl-es-2-0-your-first-traingles/),重写helloworld的onDraw函数。

void HelloWorld::onDraw()
{
 getGLProgram()->use();
 getGLProgram()->setUniformsForBuiltins();
    auto size = Director::getInstance()->getWinSize();
    Vec3 ver] = {
        Vec3(0.0,0.0,0.0),
        Vec3(size.width, 0.0,0.0),
        Vec3(size.width/2, size.height,0.0),
    };
 
    Color4F color] = {
        Color4F(1.0, 0.0, 0.0, 1.0),
        Color4F(0.0, 1.0, 0.0, 1.0),
        Color4F(0.0, 0.0, 1.0, 1.0),
    };
 
 GL::enableVertexAttribs(GL::VERTEX_ATTRIB_FLAG_POSITION | GL::VERTEX_ATTRIB_FLAG_COLOR);
 glVertexAttribPointer(GL::VERTEX_ATTRIB_FLAG_POSITION, 3, GL_FLOAT, GL_FALSE, 0, ver);
    glVertexAttribPointer(GL::VERTEX_ATTRIB_FLAG_COLOR, 4, GL_FLOAT, GL_FALSE, 0, color);
 
 glDrawArrays(GL_TRIANGLES, 0, 3);
 
 CC_INCREMENT_GL_DRAWN_BATCHES_AND_VERTICES(1, 3);
 
 CHECK_GL_ERROR_DEBUG();

}

```


在init函数中有设置shader,参考了colorlayer的写法。编译的时候会提示在 glDrawArrays(GL_TRIANGLES, 0, 3); 这一句 EXC_BAD_ACCESS 在网上查资料,说可能是数组越界。可是这里的三角形,三个顶点,每个顶点一个颜色,是哪里出来错误呢?求大侠指导。


下面是init 和 draw 函数的代码,如果有需要的话。


// on "init" you need to initialize your instance
bool HelloWorld::init()
{
 //////////////////////////////
 // 1. super init first
    if ( !Layer::init() )
    {
 return false;
    }
 
 this->setGLProgram(GLProgramCache::getInstance()->getGLProgram(GLProgram::SHADER_NAME_POSITION_COLOR));
 
 return true;
}


//void HelloWorld::visit(Renderer *renderer, const Mat4& parentTransform, uint32_t parentFlags)
void HelloWorld::draw(Renderer *renderer, const Mat4 &transform, uint32_t flags)
{
    Layer::draw(renderer, transform, flags);
 _command.init(_globalZOrder);
 _command.func = CC_CALLBACK_0(HelloWorld::onDraw, this);
    renderer->addCommand(&_command);

}


```

问题解决啦,是因为
glVertexAttribPointer(GL::VERTEX_ATTRIB_FLAG_POSITION, 3, GL_FLOAT, GL_FALSE, 0, ver);
glVertexAttribPointer(GL::VERTEX_ATTRIB_FLAG_COLOR, 4, GL_FLOAT, GL_FALSE, 0, color);
这两句的参数传错了。
改为:
glVertexAttribPointer(GLProgram::VERTEX_ATTRIB_POSITION, 3, GL_FLOAT, GL_FALSE, 0, ver);
glVertexAttribPointer(GLProgram::VERTEX_ATTRIB_COLOR, 4, GL_FLOAT, GL_FALSE, 0, color);
成功编译,显示出三角形。