在学习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);
}
```