gpt4 book ai didi

OSX 上的 OpenGL 和 SDL - glDrawElements() 上的 EXC_BAD_ACCESS - 适用于 GLUT,不适用于 SDL

转载 作者:行者123 更新时间:2023-12-02 09:02:56 24 4
gpt4 key购买 nike

我使用 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));

最佳答案

我没有发现您的代码有任何问题。

当您获得 EXC_BAD_ACCESS 时,通常是因为尝试访问未分配或已释放的对象。

您可以通过启用 NSZombieEnabled 环境变量来获取有关对象的更详细的调试信息。 This是一篇关于如何启用此环境变量的简单博客文章(我不是作者)。

这有望有助于在调试控制台中获取有关崩溃原因的更多信息。

关于OSX 上的 OpenGL 和 SDL - glDrawElements() 上的 EXC_BAD_ACCESS - 适用于 GLUT,不适用于 SDL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4089002/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com