2012-02-12 18 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)あなたがpo glGetErrorを行うことは右のその行を実行した後、それは0を出力しますことがわかります(GL_INVALID_VALUEエラーを生成します)。

理由は、OpenGL ESは3色成分をサポートしていないということです、documentation状態:

GL_INVALID_VALUEは、サイズが4

ない場合場合のコードはOKになります生成されますアルファを追加してカラーコンポーネントの数を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スタック:

glPushClientAttrib(GL_CLIENT_VERTEX_ARRAY_BIT); 

///vertex array init and usage 

glPopClientAttrib(); 
関連する問題