2012-02-12 4 views
4

iOS에서 OpenGL을 사용하기 시작했습니다. OpenGL에서 항상 glBegin()glEnd()을 사용하여 물건을 그리는 법을 배웠습니다.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 오류가 발생는 (당신이 볼 수 있습니다).

이유는 OpenGL ES는 3 개 색 구성 요소의 documentation 상태를 지원하지 않는다는 것입니다 : 크기가 아닌 경우

GL_INVALID_VALUE가 생성됩니다 4.

당신의 코드가 확인 될 것입니다 당신이 경우 알파를 추가하여 색상 구성 요소의 수를 4로 변경하십시오.

+0

+1 : 흥미로운 점은 – Sam

+0

고맙습니다! 그게 효과가있어 :) 알파 값으로 이미지로드를 시도 할 때까지 나는 짐작하지 못했을 것이다. – Lupi

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 스택 : po glGetError을하는 것이 바로 그 라인을 실행 한 후, 그것은 0을 인쇄 할 것을

glPushClientAttrib(GL_CLIENT_VERTEX_ARRAY_BIT); 

///vertex array init and usage 

glPopClientAttrib();