在glGenTextures上获取EXC_BAD_ACCESS

Getting a EXC_BAD_ACCESS on glGenTextures

本文关键字:BAD ACCESS EXC 获取 glGenTextures      更新时间:2023-10-16

用SDL2&SDL2_image,基于http://open.gl

一旦到达glGenTextures调用,我就会得到主题错误。我的大多数搜索都提到还没有创建gl上下文。我已经成功地使用了多次gl调用。这是我的主菜。所以

int main(int argc, const char * argv[]) {
    uniforms = std::vector<GLuint>();
    SDL_Init(SDL_INIT_VIDEO);
    SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_CORE);
    SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3);
    SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 2);
    SDL_Window* window = SDL_CreateWindow("OpenGL", 100, 100, 800, 600, SDL_WINDOW_OPENGL);
    SDL_GLContext context = SDL_GL_CreateContext(window);
    glewExperimental = GL_TRUE;
    glewInit();
    SDL_Event windowEvent;
    glEnable(GL_BLEND);
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
    GLuint vao;
    glGenVertexArrays(1, &vao);
    glBindVertexArray(vao);
    GLuint vbo;
    glGenBuffers(1, &vbo);
    GLuint ebo;
    glGenBuffers(1, &ebo);
    setupVertices(vbo);
    setupElementBuffer(ebo);
    GLuint fragmentShader;
    GLuint vertexShader;
    GLuint shaderProgram = compileShaders(vertexShader, fragmentShader);
    bindAttributes(shaderProgram);
    GLuint tex;
    glGenTextures(GL_TEXTURE_2D, &tex);
    SDL_Surface *image = IMG_Load("pic.png");
    if (!image) {
        assert(false);
    }

    int mode;
    if (image->format->BytesPerPixel == 3) { // RGB 24bit
        mode = GL_RGB;
    } else if (image->format->BytesPerPixel == 4) { // RGBA 32bit
        mode = GL_RGBA;
    }
    glBindTexture(GL_TEXTURE_2D, tex);
    // ... etc

glGenTextures()将一个计数作为第一个参数,该计数表示要创建的纹理名称的数量,并将一个指针作为第二个参数,指向一个足够容纳所有名称的arry。您正在呼叫

GLuint tex;
glGenTextures(GL_TEXTURE_2D, &tex);

因此,您使用GL_TEXTURE_2D作为计数,这是一个相当大的数字,GL将覆盖堆栈上tex后面的任何内容,导致崩溃。。。

我使用这个修复程序:glGenTextures(1,&textureId);