【发布时间】: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 版本及其提供的框架版本相关。