2016-07-15 120 views
0

我在OpenGL中有一個項目,我試圖加載着色器。我使用GLuint shader=glCreateShader(shaderType);。問題是,當它試圖運行這條線時,我得到EXC_BAD_ACCESS(code = 1,address = 0x0)錯誤(在XCode中)。glCreateShader導致EXC_BAD_ACCESS

我發現了一些答案,我可能沒有初始化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版本。現在會有問題嗎?

+0

這有點混亂。你能編輯你的問題嗎? (我不完全確定是什麼導致了錯誤。) – 2016-07-15 21:41:42

+0

調用glCreateShader函數會導致錯誤。 –

+1

正在考慮...... – 2016-07-15 21:50:24

回答

0

錯誤是內存之一。檢查返回值glCreateShader()This說,「如果沒有令牌留下來檢索一個空指針返回。」 This說:

  • 指針可能從來未初始化。
  • 由於您超出了數組的範圍,指針可能會被意外寫入。
  • 指針可能是不正確鑄造並寫入的對象的一部分。
  • 以上任何一種情況都可能破壞了一個不同的指針,該指針現在指向或接近此指針,並使用該指針破壞此指針(依此類推)。
+0

什麼?您將文本從答案複製到不相關的問題。 'glCreateShader()'甚至不返回一個指針,或者將一個指針作爲參數。 –

+0

'glCreateShader'爲NULL。不是調用'glCreateShader()'的結果。 –

0

我發現了一個問題。在我的情況下,這是XCode中的一個糟糕的項目配置。 我有2 libGlew dylibs鏈接。

libraries

當我刪除libGLEWmx.1.13.0.dylib一切都開始工作。

+1

在MacOS X中,你根本不需要GLEW。我強烈建議您刪除GLEW,除非您需要* Apple特有的擴展*。 – datenwolf

+0

問題是這是一個大學項目,我們必須使用它。如果我做了自己的項目,我可能會使用蘋果擴展 –

+1

我想你誤解了我。在MacOS X中,您不必使用擴展。你不需要MacOS X中的GLEW來使用現代OpenGL中的東西*,除非*你想使用一些擴展。所以你最好的行動是從你的項目中刪除GLEW;或者如果你跨平臺的話,可以從MacOS X版本中省略它。 – datenwolf