转换glGenBuffers()时出现“运行时检查失败#0”错误

时间:2013-12-04 10:40:29

标签: c++ opengl glew glfw

#include <GL/glew.h>
#include <GL/GL.h>
#include <GLFW/glfw3.h>
#include <thread>
#define GLEW_STATIC

int main(){
    glewInit();
    glewExperimental = GL_TRUE;

    glfwInit();

    glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
    glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 2);
    glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);

    glfwWindowHint(GLFW_RESIZABLE, GL_FALSE);

    GLFWwindow* window = glfwCreateWindow(800, 600, "OpenGL", nullptr, nullptr); // Windowed
    //GLFWwindow* window = glfwCreateWindow(1920, 1080, "OpenGL", glfwGetPrimaryMonitor(), nullptr); fs
    glfwMakeContextCurrent(window);
    typedef void (*GENBUFFERS) (GLsizei, GLuint*);
    GENBUFFERS glGenBuffers = (GENBUFFERS)glfwGetProcAddress("glGenBuffers");


    float vertices[] = {
     0.0f,  0.5f, // Vertex 1 (X, Y)
     0.5f, -0.5f, // Vertex 2 (X, Y)
    -0.5f, -0.5f  // Vertex 3 (X, Y)
    };
    GLuint vertexBuffer;
    glGenBuffers(1, &vertexBuffer);
    printf("%u\n", vertexBuffer);
    glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer);
    glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);

    glfwSetWindowShouldClose(window, GL_FALSE);

    while(!glfwWindowShouldClose(window)){
    glfwSwapBuffers(window);
    glfwPollEvents();
    if (glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS)
        glfwSetWindowShouldClose(window, GL_TRUE);
    }


    glfwTerminate();
}

嗨,我只是一个无能的程序员,这是我的问题,当我编译这个我得到

  

运行时检查失败#0 - 未正确保存ESP的值   跨函数调用。这通常是调用a的结果   用一个带有函数指针的调用约定声明的函数   用不同的调用约定声明。

此代码来自http://open.gl/context

我知道这是某种初始化问题,但我太过于迟钝而无法理解正在发生的事情。有人可以向我解释我做错了什么以及我打算做什么呢?

编辑:代码修复进度 (最后一个问题的解决方案:先设置glfwMakeContextCurrent(window);,然后调用glewInit();

#include <GL/glew.h>
#include <GL/GL.h>
#include <GLFW/glfw3.h>
#include <thread>
#define GLEW_STATIC

int main(){

    glewExperimental = GL_TRUE;

    glfwInit();

    glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
    glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 2);
    glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);

    glfwWindowHint(GLFW_RESIZABLE, GL_FALSE);

    GLFWwindow* window = glfwCreateWindow(800, 600, "OpenGL", nullptr, nullptr); // Windowed
    //GLFWwindow* window = glfwCreateWindow(1920, 1080, "OpenGL", glfwGetPrimaryMonitor(), nullptr); fs

    typedef void (*GENBUFFERS) (GLsizei, GLuint*);
    GENBUFFERS glGenBuffers = (GENBUFFERS)glfwGetProcAddress("glGenBuffers");



    glfwMakeContextCurrent(window);


    glewInit();


    GLuint vertexBuffer;

    glGenBuffers(1, &vertexBuffer);
    printf("%u\n", vertexBuffer);

    float vertices[] = {
     0.0f,  0.5f, // Vertex 1 (X, Y)
     0.5f, -0.5f, // Vertex 2 (X, Y)
    -0.5f, -0.5f  // Vertex 3 (X, Y)
    };


    glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer);


    glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);



    //glfwSetWindowShouldClose(window, GL_FALSE);


    while(!glfwWindowShouldClose(window)){
    glfwSwapBuffers(window);
    glfwPollEvents();
    if (glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS)
        glfwSetWindowShouldClose(window, GL_TRUE);
    }


    glfwTerminate();
}

当前错误:0x00000000处的第一次机会异常执行位置0x00000000的访问冲突。

RIGHT!最终进度报告: 事实证明,GLEW为你做了typedef事情(//typedef void (*GENBUFFERS) (GLsizei, GLuint*); //GENBUFFERS glGenBuffers = (GENBUFFERS)glfwGetProcAddress("glGenBuffers"); 所以删除这个,我基本上重新定义了已经定义的废话,这是愚蠢的。 OK LESSON LEARNED,在您盲目地按照教程之前阅读您正在使用的API中的文档

最终法规改进

#include <GL/glew.h>
#include <GL/GL.h>

#include <GLFW/glfw3.h>
#include <thread>
#define GLEW_STATIC

int main(){
    //printf("%s\n", glGetString(GL_EXTENSIONS))
    glewExperimental = GL_TRUE;

    glfwInit();

    glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
    glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 2);
    glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);

    glfwWindowHint(GLFW_RESIZABLE, GL_FALSE);

    GLFWwindow* window = glfwCreateWindow(800, 600, "OpenGL", nullptr, nullptr); // Windowed
    //GLFWwindow* window = glfwCreateWindow(1920, 1080, "OpenGL", glfwGetPrimaryMonitor(), nullptr); fs

    //typedef void (*GENBUFFERS) (GLsizei, GLuint*);
    //GENBUFFERS glGenBuffers = (GENBUFFERS)glfwGetProcAddress("glGenBuffers");

    printf("%s\n", glGetString(GL_EXTENSIONS));

    glfwMakeContextCurrent(window);


    glewInit();


    GLuint vertexBuffer;

    glGenBuffers(1, &vertexBuffer);
    printf("%u\n", vertexBuffer);

    float vertices[] = {
     0.0f,  0.5f, // Vertex 1 (X, Y)
     0.5f, -0.5f, // Vertex 2 (X, Y)
    -0.5f, -0.5f  // Vertex 3 (X, Y)
    };


    glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer);


    glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);



    //glfwSetWindowShouldClose(window, GL_FALSE);


    while(!glfwWindowShouldClose(window)){
    glfwSwapBuffers(window);
    glfwPollEvents();
    if (glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS)
        glfwSetWindowShouldClose(window, GL_TRUE);
    }


    glfwTerminate();
}

0 个答案:

没有答案
相关问题