2012-02-12 49 views
4

我开始在iOS中使用OpenGL。我总是学会了使用glBegin()glEnd()在OpenGL中绘制东西,所以这对我来说是新的。OpenGL,glDrawArrays和IOS,错误的访问?

我想绘制一个简单的三角形。我可以很好地绘制一个白色三角形,我甚至可以使用glColor绘制一个完整的彩色三角形。但是,每当我尝试使用下面的代码为每个顶点分配一个颜色时,在绘制数组时,我会得到一个EXC_BAD_ACCESS。我正在使用iOS 4.3模拟器。我究竟做错了什么?

- (void) render:(CADisplayLink*)displayLink { 
    glClearColor(0, 104.0/255.0, 55.0/255.0, 1.0); 
    glClear(GL_COLOR_BUFFER_BIT); 

    glMatrixMode(GL_MODELVIEW); 
    glLoadIdentity(); 

    GLfloat vertices [] = {0,0,0, 0,100,0, 100,0,0}; 
    GLfloat colours [] = {1.0,1.0,1.0, 1.0,1.0,1.0, 1.0,1.0,1.0}; 
    glEnableClientState(GL_VERTEX_ARRAY); 
    glEnableClientState(GL_COLOR_ARRAY); 
    glVertexPointer(3, GL_FLOAT, 0, vertices); 
    glColorPointer(3, GL_FLOAT, 0, colours); 
    glDrawArrays(GL_TRIANGLES, 0, 3); <-- CRASHES HERE 
    glDisableClientState(GL_VERTEX_ARRAY); 
    glDisableClientState(GL_COLOR_ARRAY); 

    [self.context presentRenderbuffer:GL_RENDERBUFFER]; 
}  

回答

5

线glColorPointer(3, GL_FLOAT, 0, colours)产生GL_INVALID_VALUE错误(你可以看到,这样做po glGetError执行这条线之后,它会打印1281)。

的原因是,OpenGL ES的不支持3个色元件,documentation状态:产生

GL_INVALID_VALUE如果大小不是4

您的代码将是确定的,如果你通过添加alpha将颜色分量的数量更改为4。

+0

+1:有趣的事情知道 – Sam 2012-02-12 14:54:34

+0

谢谢!这工作:) 我永远不会hav猜测,直到我尝试加载图像的alpha值 – Lupi 2012-02-12 15:07:23

1

你的OpenGL代码看起来正确为止。 拨打glDrawArrays是否会导致访问不正常,或者访问不正确的访问? 我只能想象,glDrawArrays func指针未初始化, 顶点数组应该可用。

你可以叫glEnableClientState(GL_COLOR_ARRAY); 后,该功能作为测试重置的所有其他陈旧的指针数组,这可能会造成不好的访问:

///@brief Emulation of call glClientAttribDefaultEXT(GL_CLIENT_VERTEX_ARRAY_BIT) according to GL_EXT_direct_state_access. 

static void ClientAttribDefaultVertexArray(void) { 
    int i; 
    GLint max; 

    glBindBufferARB(GL_ARRAY_BUFFER, 0); 
    glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER, 0); 

    glDisableClientState(GL_EDGE_FLAG_ARRAY); 
    glEdgeFlagPointer(0, 0); 

    glDisableClientState(GL_INDEX_ARRAY); 
    glIndexPointer(GL_FLOAT, 0, 0); 

    glDisableClientState(GL_SECONDARY_COLOR_ARRAY); 
    glSecondaryColorPointer(4, GL_FLOAT, 0, 0); 

    glDisableClientState(GL_FOG_COORD_ARRAY); 
    glFogCoordPointer(GL_FLOAT, 0, 0); 

    glGetIntegerv(GL_MAX_TEXTURE_COORDS, &max); 
    for (i = 0; i < max; ++i) { 
     glClientActiveTextureARB(GL_TEXTURE0 + i); 
     glDisableClientState(GL_TEXTURE_COORD_ARRAY); 
     glTexCoordPointer(4, GL_FLOAT, 0, 0); 
    } 

    glDisableClientState(GL_COLOR_ARRAY); 
    glColorPointer(4, GL_FLOAT, 0, 0); 

    glDisableClientState(GL_NORMAL_ARRAY); 
    glNormalPointer(GL_FLOAT, 0, 0); 

    glDisableClientState(GL_VERTEX_ARRAY); 
    glVertexPointer(4, GL_FLOAT, 0, 0); 

    glDisableClientState(GL_WEIGHT_ARRAY_ARB); 
    glWeightPointerARB(0, GL_FLOAT, 0, 0); 

    glGetIntegerv(GL_MAX_VERTEX_ATTRIBS, &max); 
    for (i = 0; i < max; ++i) { 
     glDisableVertexAttribArrayARB(i); 
     glVertexAttribPointerARB(i, 4, GL_FLOAT, GL_FALSE, 0, 0); 
    } 

    glClientActiveTextureARB(GL_TEXTURE0); 
} 

此外,还可以推及弹出客户端上的顶点数组状态ATTRIB堆栈:

glPushClientAttrib(GL_CLIENT_VERTEX_ARRAY_BIT); 

///vertex array init and usage 

glPopClientAttrib();