使用 glew 时 opengl 崩溃

opengl crashing when use glew

当我在 unsigned int 缓冲区下使用这 3 行时,opengl 在使用 glew 时崩溃

    if (glfwInit() != GLEW_OK) {
    std::cout << "Error" << std::endl;
}

float positions[6] = {
     -0.5, -0.5,
     0, 0.5,
     0.5, -0.5
};
unsigned int buffer;


//glGenBuffers(1, &buffer);
    //glBindBuffer(GL_ARRAY_BUFFER, buffer);
    //glBufferData(GL_ARRAY_BUFFER, 6* sizeof(float), positions, GL_STATIC_DRAW);

它向我显示控制台错误,但当我使用这三个代码时不会崩溃 在 unsigned int 缓冲区下,我观看了 cherno 项目并尝试了他的代码,但我认为这是同样的错误,因为我的 gpu 是旧的

glfwInit() ?不,那是 glfw (window gui) 而不是 glew (指向 OGL API 的函数指针)。使用 glewInit()

添加到 Ripi2 的回答:

That's for glfw (window gui) not glew (function pointers to OGL API)

这意味着:

GLFW 用于创建 OpenGL 上下文,即创建 windows。它具有 window 在各种平台上创建的代码,因此您不必自己编写代码。

GLEW 只是获取您的 OpenGL 实现,供您通过函数指针使用。

因此,您应该始终在 #include <GLFW/glfw3.h 之前 #include <GL/glew.h>

您可以通过以下方式检查 GLFW 初始化:

if (!glfwInit()) {
...
}

您可以通过以下方式检查 GLEW 初始化:

if (glewInit() != GLEW_OK) {
...
}

您必须在创建 OpenGL 上下文后立即初始化 GLEW. Call glewInit

if ( glfwInit() != GLFW_TRUE ) {
    // error handling
    // ...
}

GLFWwindow *wnd = glfwCreateWindow( ... );
if ( wnd == nullptr ) {
    // error handling
    // ...
}

glfwMakeContextCurrent(wnd);

glewExperimental = GL_TRUE;
if ( glewInit() != GLEW_OK ) {
    // error handling
    // ...
}

请注意,glewInit returns GLEW_OK if succeeded. glewInit 初始化 OpenGL 函数的函数指针。如果您尝试通过未初始化的函数指针调用函数,则会发生分段错误。

Glew 可以通过 glewExperimental = GL_TRUE; 启用其他扩展。看到 GLEW documentation 上面写着:

GLEW obtains information on the supported extensions from the graphics driver. Experimental or pre-release drivers, however, might not report every available extension through the standard mechanism, in which case GLEW will report it unsupported. To circumvent this situation, the glewExperimental global switch can be turned on by setting it to GL_TRUE before calling glewInit(), which ensures that all extensions with valid entry points will be exposed.