使用glew时opengl崩溃

Posted

技术标签:

【中文标题】使用glew时opengl崩溃【英文标题】:opengl crashing when use glew 【发布时间】:2019-08-27 22:32:58 【问题描述】:

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

    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 是旧的

【问题讨论】:

【参考方案1】:

添加到 Ripi2 的答案:

这是为 glfw(窗口 gui)而不是 glew(指向 OGL API 的函数指针)

这意味着:

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

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

因此,您应该始终将#include &lt;GL/glew.h&gt; 放在#include &lt;GLFW/glfw3.h 之前。

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

if (!glfwInit()) 
...

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

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

【讨论】:

我在 glfw3 之前包含了 glew,但我仍然想知道为什么当我尝试 if(!glfwInit()) 时它不会显示错误 如果你不使用 glew 函数指针 glBindBuffer 指向一个未定义的地方(而不是指向 OGL 驱动程序中的一个点),你就会崩溃。【参考方案2】:

你必须初始化GLEW。在创建 OpenGL 上下文后立即调用 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 将返回 GLEW_OKglewInit 初始化 OpenGL 函数的函数指针。如果尝试通过未初始化的函数指针调用函数,则会发生分段错误。

Glew 可以通过glewExperimental = GL_TRUE; 启用其他扩展。请参阅GLEW documentation,上面写着:

GLEW 从图形驱动程序获取有关支持的扩展的信息。然而,实验性或预发布驱动程序可能不会通过标准机制报告每个可用的扩展,在这种情况下,GLEW 将报告它不受支持。为了避免这种情况,可以在调用glewInit()之前将glewExperimental全局开关设置为GL_TRUE,这样可以确保所有具有有效入口点的扩展都将被暴露。

【讨论】:

【参考方案3】:

glfwInit() ?不,这是针对 glfw (window gui) 而不是 glew (function pointers to OGL API) 的。使用glewInit()

【讨论】:

以上是关于使用glew时opengl崩溃的主要内容,如果未能解决你的问题,请参考以下文章

调用OpenGL函数时程序崩溃

SDL OpenGL 应用程序在发布模式下崩溃 [重复]

OpenGL程序不断崩溃?

使用带有 glew 的 VBO 访问冲突

glGenBuffers 为 NULL,在使用 glew 时给出 0x0000000 访问冲突

使用 OpenGL 正确关闭 SDL