在 glGenTextures 上获取 EXC_BAD_ACCESS

Posted

技术标签:

【中文标题】在 glGenTextures 上获取 EXC_BAD_ACCESS【英文标题】:Getting a EXC_BAD_ACCESS on glGenTextures 【发布时间】:2015-02-13 20:54:17 【问题描述】:

基于http://open.gl,尝试使用 SDL2 和 SDL2_image 使用 C++ 和 OpenGL

一旦到达 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

【问题讨论】:

【参考方案1】:

glGenTextures()count 作为第一个参数,表示要创建多少个纹理名称,第二个参数是指向一个足以容纳所有名称的数组的指针。你在打电话

GLuint tex;
glGenTextures(GL_TEXTURE_2D, &tex);

所以您使用GL_TEXTURE_2D 作为计数,这是一个相当大的数字,GL 将覆盖您堆栈中tex 后面的任何内容,从而导致崩溃...

【讨论】:

在我发现的 open.gl 和一个 sdl 示例中,我不确定我是如何读错的。也看了10遍哈哈。必须是星期五:)。谢谢!【参考方案2】:

我用这个修复它: glGenTextures(1, &textureId);

【讨论】:

您需要使用 GL_TEXTURE_2D 常量而不是硬数字。常量只是数值,随着您的前进,它会更容易理解。

以上是关于在 glGenTextures 上获取 EXC_BAD_ACCESS的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 glGenTextures

OpenGL纹理操作--glGenTextures

OpenGL纹理操作--glGenTextures

尽管 OpenGL 上下文有效,glGenTextures 仍给出 GL_INVALID_OPERATION

在执行 glTexImage2D 和 glTexSubImage2D 之前是不是需要调用 glGenTextures 和 glBindTexture

openGL之API学习(一九四)glGenTextures glActiveTexture