2010-11-03 71 views
2

我使用GLUT編寫了一個簡單的應用程序,現在我將它移植到SDL中以將其變爲遊戲。OSX上的OpenGL和SDL - glDrawElements()上的EXC_BAD_ACCESS() - 適用於GLUT,不適用於SDL

我有一個奇怪的問題,特別是使用glDrawElements和頂點緩衝區對象,SDL 1.2.14 OSX。如果我不使用VBO,程序運行良好。它只在使用VBO時拋出「EXC_BAD_ACCESS」。爲了使這個問題更加模糊。該程序在GLUT中運行得很好。我必須在我的初始化中丟失一些可能導致這種情況的東西。

這裏的繪圖代碼:

if (glewGetExtension("GL_ARB_vertex_buffer_object")) 
{ 
    glEnableClientState(GL_VERTEX_ARRAY); 
    glEnableClientState(GL_NORMAL_ARRAY); 
    glEnableClientState(GL_TEXTURE_COORD_ARRAY);   

    //Load vertices 
    glBindBuffer(GL_ARRAY_BUFFER, this->mesh->vbo_vertices); 
    glVertexPointer(3, GL_FLOAT, 0, BUFFER_OFFSET(0)); 

    //Load normals 
    glBindBuffer(GL_ARRAY_BUFFER, this->mesh->vbo_normals); 
    glNormalPointer(GL_FLOAT, 0, BUFFER_OFFSET(0)); 

    //Load UVs 
    glBindBuffer(GL_ARRAY_BUFFER, this->mesh->vbo_uvs); 
    glTexCoordPointer(2, GL_FLOAT, 0, BUFFER_OFFSET(0)); 

    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, this->mesh->vbo_index); 
    App dies here -----> glDrawElements(GL_TRIANGLES, 3*this->mesh->numFaces, GL_UNSIGNED_INT, BUFFER_OFFSET(0)); 

    glDisableClientState(GL_VERTEX_ARRAY); 
    glDisableClientState(GL_NORMAL_ARRAY); 
    glDisableClientState(GL_TEXTURE_COORD_ARRAY); 

} else { 

    //BTW: If I run this block of code instead of the above, everything renders fine. App doesn't die. 

    //Drawing with vertex arrays 
    glEnableClientState(GL_VERTEX_ARRAY); 
    glEnableClientState(GL_NORMAL_ARRAY); 
    glEnableClientState(GL_TEXTURE_COORD_ARRAY); 

    glVertexPointer(3, GL_FLOAT, 0, this->mesh->vertexArray); 
    glNormalPointer(GL_FLOAT, 0, this->mesh->normalsArray); 
    glTexCoordPointer(2, GL_FLOAT, 0, this->mesh->uvArray); 

    glDrawElements(GL_TRIANGLES, 3*this->mesh->numFaces, GL_UNSIGNED_INT, this->mesh->indexArray); 

    glDisableClientState(GL_VERTEX_ARRAY); 
    glDisableClientState(GL_NORMAL_ARRAY); 
    glDisableClientState(GL_TEXTURE_COORD_ARRAY); 
} 

這裏的調試信息:

Program received signal: 「EXC_BAD_ACCESS」. 

Thread-1-<com.apple.main-thread> 
#0 0x17747a93 in gleRunVertexSubmitImmediate 
#1 0x1774772c in gleLLVMArrayFunc 
#2 0x177476e4 in gleSetVertexArrayFunc 
#3 0x1773073c in gleDrawArraysOrElements_ExecCore 
#4 0x176baa7b in glDrawElements_Exec 
#5 0x97524050 in glDrawElements 

asm gleRunVertexSubmitImmediate 

0x17747a93 <+0771> mov (%eax,%ecx,4),%eax  <-- the app dies on this. 

這裏是我的SDL初始化代碼:

//Initialize SDL 
if (SDL_Init(SDL_INIT_VIDEO) < 0) 
{ 
    cout << "Could not initialize SDL" << endl << SDL_GetError(); 
    exit(2); 
} 

//Set window 
SDL_WM_SetCaption("Hello World!", "Hello World!"); 

//Set openGL window 
if (SDL_SetVideoMode(width, height, 32, SDL_OPENGL | SDL_RESIZABLE) == NULL) { 
    cout << "Unable to create OpenGL context: %s\n" << endl << SDL_GetError(); 
    SDL_Quit(); 
    exit(2); 
} 

//Set up event handling 
SDL_Event event; 
bool quit = false; 

//Initialize GLEW 
GLenum err = glewInit(); 
if (GLEW_OK != err) 
{ 
    //Problem: glewInit failed, something is seriously wrong. 
    fprintf(stderr, "Error: %s\n", glewGetErrorString(err)); 
    exit(1); 
} 
fprintf(stdout, "Status: Using GLEW %s\n", glewGetString(GLEW_VERSION)); 
+0

你在哪裏分配你的VBO ID(this-> mesh-> vbo_vertices和朋友,我懷疑)? – genpfault 2010-11-03 18:08:55

+0

是的。分配似乎很好,因爲我提到,使用GLUT時上述工作。只有在SDL下我才能看到錯誤。 – 2010-11-03 18:47:57

回答

1

我看不出有什麼毛病你碼。

當您得到EXC_BAD_ACCESS時,通常是因爲嘗試訪問未分配的對象或已被釋放的對象。

通過啓用NSZombieEnabled環境變量,您可以獲得有關該對象的更詳細的調試信息。 This是一篇關於如何啓用這個環境變量的簡單博客文章(我不是作者)。

這將有助於在調試控制檯中獲得更多關於崩潰發生的原因的信息。

+0

我已經啓用了殭屍模式,但不幸的是它並沒有真正改變我的調試輸出。 – 2010-11-03 17:59:11

+0

在緩衝區中使用它們並繪製調用之前,我將開始打印出網格的屬性。 mesh-> vbo_vertices,mesh-> numFaces等。 – 2010-11-03 20:52:48

1

如果你沒有在你的模型(OBJ)文件VN,你應該註釋掉以下行:

//glEnableClientState(GL_NORMAL_ARRAY); 
//glDisableClientState(GL_NORMAL_ARRAY); 

那一個爲我工作。