我使用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));
你在哪裏分配你的VBO ID(this-> mesh-> vbo_vertices和朋友,我懷疑)? – genpfault 2010-11-03 18:08:55
是的。分配似乎很好,因爲我提到,使用GLUT時上述工作。只有在SDL下我才能看到錯誤。 – 2010-11-03 18:47:57