【问题标题】:glCreateShader causes EXC_BAD_ACCESSglCreateShader 导致 EXC_BAD_ACCESS
【发布时间】:2016-11-19 05:01:58
【问题描述】:

我在 OpenGL 中有一个项目,我正在尝试加载着色器。我为此使用GLuint shader=glCreateShader(shaderType);。问题是,当它尝试运行这一行时,我得到 EXC_BAD_ACCESS (code=1, address=0x0) 错误(在 XCode 中)。

我找到了一些我可能没有初始化 glfw 或 glew 的答案。但它似乎工作得很好。这是我的初始化代码:

if (!glfwInit()) {
        fprintf(stderr, "Couldn't initialize GLFW.\n");
        exit(EXIT_FAILURE);
    }

    glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
    glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
    glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
    glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);
    glfwSetErrorCallback(errorCallback);
    GLFWwindow* window = glfwCreateWindow(WIDTH, HEIGHT, "OpenGL Test", nullptr, nullptr);

    if (!window) {
        fprintf(stderr, "Couldn't create window.\n");
        glfwTerminate();
        exit(EXIT_FAILURE);
    }

    glfwMakeContextCurrent(window);
    glfwSwapInterval(1);

    if (glewInit() != GLEW_OK) {
        fprintf(stderr, (char*)"Couldn't initialize GLEW library.\n");
        exit(EXIT_FAILURE);
    }

    initOpenGLProgram(window);

initOpenGLProgram():

glClearColor(0, 0, 0, 1);
glEnable(GL_DEPTH_TEST);
glfwSetKeyCallback(window, keyCallback);

shaderProgram = new ShaderProgram((char*)"shaders/vshader.glsl", NULL, (char*)"shaders/fshader.glsl");

在新的ShaderProgram:

printf("Loading vertex shader...\n");
vertexShader=loadShader(GL_VERTEX_SHADER,vertexShaderFile);

loadShader 方法中(此行会抛出错误):

GLuint shader=glCreateShader(shaderType);

我还有一个问题。我需要在 OpenGL 3.3 中完成我的项目,但是当我使用 glGetString(GL_VERSION) 检查版本时,我得到了 4.1 版本。现在会有问题吗?

【问题讨论】:

  • 这有点令人困惑。你能编辑你的问题吗? (我不完全确定是什么导致了这个错误。)
  • 调用 glCreateShader 函数会导致错误。
  • 我认为在调用glewInit() 之前,您通常需要一个glewExperimental = TRUE。见stackoverflow.com/questions/8302625/…
  • @RetoKoradi 我也用glewExperimental = true 做到了,它没有任何改变
  • @RetoKoradi:实际上 OP 根本不需要 GLEW。在 MacOS X 中,您要么通过 OpenGL 框架获得所需的所有功能,要么不获得。有一个扩展机制,但那真的只是为了扩展。核心功能与操作系统版本支持的 OpenGL 版本及其提供的框架版本相关。

标签: c++ opengl


【解决方案1】:

错误是内存之一。检查glCreateShader().This 的返回值,“如果没有要检索的令牌,则返回空指针。”This 说:

  • 指针可能从未被初始化。
  • 指针可能被意外覆盖,因为您超出了数组的边界。
  • 指针可能是对象的一部分,该对象被错误转换,然后被写入。
  • 上述任何一项都可能破坏了另一个指针,该指针现在指向或靠近该指针,并且使用该指针会破坏这个指针(依此类推)。

【讨论】:

  • 什么?您从不相关问题的答案中复制了文本。 glCreateShader() 甚至不返回指针,或将指针作为参数。
  • glCreateShader 为 NULL。不是调用glCreateShader()的结果。
【解决方案2】:

我发现了一个问题。就我而言,这是 XCode 中的一个糟糕的项目配置。 我链接了 2 个 libGlew dylib。

当我删除 libGLEWmx.1.13.0.dylib 后,一切都开始工作了。

【讨论】:

  • 在 MacOS X 中,您根本不需要 GLEW。我强烈建议您删除 GLEW,除非您需要 Apple 特定的扩展
  • 问题是它是一个大学项目,我们必须使用它。如果我自己做项目,我可能会使用 Apple 扩展
  • 我想你误解了我的意思。在 MacOS X 中,您根本不必使用扩展。你不需要在 MacOS X 中使用 GLEW 来使用现代 OpenGL 的东西,除非你想使用一些扩展。所以你最好的做法是从你的项目中删除 GLEW;或者如果您是跨平台的,请从 MacOS X 构建中省略它。
猜你喜欢
  • 1970-01-01
  • 2012-07-27
  • 2012-10-02
  • 2011-04-14
  • 2017-03-15
  • 2014-09-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多