OpenGL ES EXC_BAD_ACCESS auf glDrawArrays

Ich habe ein Problem rendering in OpenGL ES 1.1 für ein iPhone-Spiel, das ich Baue.

Kurz gesagt, ich bin rendering 3 items:

  1. Hintergrund (funktioniert einwandfrei)
  2. Eine Anzahl von sphärischen Objekten (funktioniert einwandfrei)
  3. Eine einfache Linie, der Kreis, der mit der änderung der Größe (ich bin immer ein problem hier).

Grundsätzlich bin ich immer ein EXC_BAD_ACCESS Fehlermeldung, wenn ich call drawArrays auf dem Kreis. Ich habe getestet, den code in den basic iPhone OpenGL template und es funktioniert ganz gut, also kann ich nicht wirklich verfolgen, warum es nicht funktioniert hier. Kann mir jemand zeigen in der richtigen Weise?

Hier ist die drawCircle code zum Rendern der Kreis.

- (void) drawCircles
{
if (!m_circleEffects.empty())
{
    int segments = 24;
    for (int i = 0; i < m_circleEffects.size(); i++)
    {
        glMatrixMode(GL_MODELVIEW);
        glLoadIdentity();
        glTranslatef(m_circleEffects[i].position.x, m_circleEffects[i].position.y, 0);

        float radius;
        if(m_circleEffects[i].isPulseOutward)
            radius = cos(m_circleEffects[i].frameCounter * M_PI / 720);
        else
            radius = sin(m_circleEffects[i].frameCounter * M_PI / 720);

        GLfloat circlePoints[segments * 3];                    
        int count = 0;

        for (GLfloat i = 0; i < 360.0f; i += (360.0f / segments))
        {
            circlePoints[count++] = (cos(i * M_PI / 180) * radius);
            circlePoints[count++] = (sin(i * M_PI / 180) * radius);
            circlePoints[count++] = z + 1;
        }

        glEnableClientState(GL_VERTEX_ARRAY);  
        glVertexPointer(3, GL_FLOAT, 0, circlePoints);                       
        glDrawArrays(GL_LINE_LOOP, 0, segments);   
        glDisableClientState(GL_VERTEX_ARRAY);
    }      
    m_circleEffects.clear();
}
}

Und das folgende ist meine andere rendering-code. Es ist vor den oben genannten code in der run loop. Alles folgende scheint zu funktionieren OK.

- (void)passInVisualsToUse:(vector<Visual>)visuals
{
frameCounter += 0.2;
if (frameCounter >= 360)
    frameCounter -= 360;

glClearColor(0.5f, 0.5f, 0.5f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_NORMAL_ARRAY);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glEnable(GL_DEPTH_TEST);
glEnable(GL_TEXTURE_2D);

glDepthMask(GL_FALSE);

glBindTexture(GL_TEXTURE_2D, m_backgroundTexture);

glDrawTexfOES(0, 0, 0, 480, 320);
glDepthMask(GL_TRUE);

vector<Visual>::const_iterator visual = visuals.begin();
for (int visualIndex = 0;
     visual != visuals.end();
     ++visual, ++visualIndex)
{        

    if (visual->ObjectType == 1)
        glBindTexture(GL_TEXTURE_2D, m_oneTexture);
    else if (visual->ObjectType == 2)
        glBindTexture(GL_TEXTURE_2D, m_twoTexture);
    else if (visual->ObjectType == 3)
        glBindTexture(GL_TEXTURE_2D, m_threeTexture);
    else
        glBindTexture(GL_TEXTURE_2D, m_fourTexture);

    //Set the viewport transform.
    vec3 position = visual->Position;

    //Set the light position.
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();

    glTranslatef(position.x, position.y, position.z);
    float rotationAngle = visual->RotationAngle;
    glRotatef(rotationAngle, 0, 1, 0);

    float scale = visual->Scale;   

    if (visual->ShouldThrob)
    {
        float scaleFactor = scale + sin(frameCounter) / 25;
        glScalef(scaleFactor, scaleFactor, scale);

        BOOL isPulseOutward;
        if (visual->isPulseOutward)
            isPulseOutward = YES;
        else
            isPulseOutward = NO;

        CircleEffect toAdd;
        toAdd.position = position;
        toAdd.frameCounter = frameCounter;
        toAdd.isPulseOutward = isPulseOutward;
        m_circleEffects.push_back(toAdd);
    }
    else
        glScalef(scale, scale, scale);

    //Set the projection transform.
    float h = (float)screenSize.size.height / (float)screenSize.size.width;

    mat4 projection = mat4::Ortho(xleft, xright, h * xleft, h * xright, znear, zfar);

    glMatrixMode(GL_PROJECTION);
    glLoadMatrixf(projection.Pointer());

    //Draw the surface.
    int stride = sizeof(vec3) + sizeof(vec3) + sizeof(vec2);
    const GLvoid* texCoordOffset = (const GLvoid*) (2 * sizeof(vec3));
    const Drawable& drawable = m_drawables[visualIndex];
    glBindBuffer(GL_ARRAY_BUFFER, drawable.VertexBuffer);
    glVertexPointer(3, GL_FLOAT, stride, 0);
    const GLvoid* normalOffset = (const GLvoid*) sizeof(vec3);
    glNormalPointer(GL_FLOAT, stride, normalOffset);
    glTexCoordPointer(2, GL_FLOAT, stride, texCoordOffset);
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, drawable.IndexBuffer);
    glDrawElements(GL_TRIANGLES, drawable.IndexCount, GL_UNSIGNED_SHORT, 0);
}


glDisableClientState(GL_VERTEX_ARRAY);
glDisableClientState(GL_NORMAL_ARRAY);
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
glDisable(GL_DEPTH_TEST);
glDisable(GL_TEXTURE_2D);
}

Die entsprechenden Puffer wurden set-up anderswo, und wie bereits erwähnt, der zweite code funktioniert alles einwandfrei.

Grundsätzlich bin ich immer ein EXC_BAD_ACCESS auf der drawArrays-code in der oberen code-snippet. Jemand irgendwelche Ideen, warum?

Dank

  • Sind Sie rendering-dieses auf einem hintergrund-thread? Gibt es eine chance, dass etwas anderes sein könnte, den Zugriff auf den OpenGL-Kontext auf der gleichen Zeit wie dieser? Ich habe gesehen, dass die Abstürze verursachen, wie dies in der Vergangenheit.
  • Nein, es ist auf dem Haupt-thread, und ich habe nicht bekam nichts anderes läuft auf einem hintergrund-thread, der könnte den Zugriff auf den Kontext an. Übrigens, ich genoss Ihre OpenGL-Vorträge: Sie waren sehr hilfsbereit, wenn ich zu lernen, ein paar Monate zurück! [Kann ich halten Sie Schuld, wenn ich nicht lösen kann das OpenGL-problem? :-)]
InformationsquelleAutor paynio | 2011-05-27
Schreibe einen Kommentar