2015-07-12 201 views
0

我已经尝试了多次重新启动 visual studio编译它和一切,但错误似乎没有消失。但是,当我创建临时着色器和程序时,它就开始了,如果有帮助的话。0xC0000005:访问冲突读取位置0x00000000

下面是代码

#include <iostream> 
#include <string> 
#include <GL/glew.h> 
#include <GLFW/glfw3.h> 

std::string fatalError(std::string error) 
{ 
    std::cout << error << std::endl; 
    return error; 
} 

int main() 
{ 
    int screenWidth = 1024; 
    int screenHeight = 726; 

    if (!glfwInit()) 
    { 
     fatalError("GLFW failed to be initialized"); 
     glfwTerminate(); 
     return -1; 
    } 

    GLFWwindow *window; 
    window = glfwCreateWindow(screenWidth, screenHeight, "Graphics", NULL, NULL); 

    if (window == nullptr) 
    { 
     fatalError("Window failed to be created"); 
     glfwTerminate(); 
     return -1; 
    } 

    glfwMakeContextCurrent(window); 
    glewExperimental = GL_TRUE; 

    if (glewInit() != GLEW_OK) 
    { 
     fatalError("GLEW failed to be initialized"); 
     glfwTerminate(); 
     return -1; 
    } 

    GLfloat vertexData[] = 
    { 
     0.0f, 1.0f, 0.0f, 
     1.0f, -1.0f, 0.0f, 
     -1.0f, -1.0f, 0.0f 
    }; 

    GLuint vboID = 0; 
    glGenBuffers(1, &vboID); 
    glBindBuffer(GL_ARRAY_BUFFER, vboID); 
    glBufferData(GL_ARRAY_BUFFER, sizeof(vertexData), vertexData, GL_STATIC_DRAW); 

    GLuint vaoID = 0; 
    glGenVertexArrays(1, &vaoID); 
    glBindVertexArray(vaoID); 
    glEnableVertexAttribArray(0); 
    glVertexAttribPointer(0, 3, GL_ARRAY_BUFFER, GL_FALSE, 0, NULL); 

    const GLchar* vertexShader[] = 
    { 
     "#version 410 \n" 

     "in vec3 vertexPos \n" 

     "void main() \n" 
     "{ \n" 
     "gl_Position = vec4(vertexPos, 1); \n" 
     "} \n" 
    }; 

    const GLchar* fragmentShader[] = 
    { 
     "#version 410 \n" 

     "out vec4 vertexColor \n" 

     "void main() \n" 
     "{ \n" 
     "vertexColor = vec4(0.0, 1.0, 0.0, 1.0); \n" 
     "} \n" 
    }; 

    GLuint vertShader = glCreateShader(GL_VERTEX_SHADER); 
    glShaderSource(vertShader, 1, vertexShader, NULL); 
    glCompileShader(vertShader); 

    GLuint fragShader = glCreateShader(GL_FRAGMENT_SHADER); 
    glShaderSource(fragShader, 1, fragmentShader, NULL); 
    glCompileShader(fragShader); 

    GLuint program = glCreateProgram(); 
    glAttachShader(program, vertShader); 
    glAttachShader(program, fragShader); 
    glLinkProgram(program); 

    while (!glfwWindowShouldClose(window)) 
    { 
     glClear(GL_COLOR_BUFFER_BIT); 
     glUseProgram(program); 
     glDrawArrays(GL_TRIANGLES, 0, 3); 
     glfwSwapBuffers(window); 
     glfwPollEvents(); 
    } 

    glfwTerminate(); 

    return 0; 
} 
+6

完美的时间学习如何[使用调试器](http://ericlippert.com/2014/03/05/how-to-debug-small-programs/)。 –

+1

重新启动Visual Studio不会让代码中的错误消失。 – dcook

回答

3

你的程序有3个问题,我能找到(之前,我有一个绿色三角形反正露面对我来说):

  • glVertexAttribPointer需要一个类型数据,而不是它应该在什么类型的缓冲区中。用GL_FLOAT代替GL_ARRAY_BUFFER得到 你进一步进入程序。
  • 两个着色器都有拼写错误。后面的参数应该有 分号。

在未来GL打交道,你应该尝试做一些误差glGetError和着色器glGetShaderInfoLog检查时(有针对here教程)。在你的代码中,glGetError在glVertexAttribePointer之后返回了GL_INVALID_ENUM,这很好的提示你的arugments不正确。 glGetShaderInfoLog(加上其他支持代码)在着色器未能编译的地方打印出来。正如其他人提到的,你也需要熟悉一个调试器(尽管在这种情况下它不会有太大的帮助)。对于GL这样的具体问题,也有一些很好的调试器(我在AMD卡上有过GPU PerfStudio的良好体验)。

+0

thx帮助这么多,我会采取您的建议熟悉一个调试器 –

相关问题