我在尝试将 GLEW 库用于我的基本 OpenGL 程序时遇到问题,该程序是使用 GLFW (glfw3.h) 编写的。一切都编译没有错误,但是一旦我调用 glewInit(),我就根本得不到任何输出,包括任何 cout 语句,无论是在初始化之前还是之后。但是,当我删除 glewInit() 调用时,一切都会按预期工作。
我想知道为什么会发生这种情况以及如何解决它。这是我的代码的简化版本:
#define GLEW_STATIC 1
#include "glew.h"
#include "glfw3.h"
#include <iostream>
int main()
{
GLFWwindow* window;
/* Initialize the library */
if (!glfwInit())
return -1;
/* Create a windowed mode window and its OpenGL context */
window = glfwCreateWindow(640, 480, "Hello World", NULL, NULL);
if (!window)
{
glfwTerminate();
return -1;
}
/* Make the window's context current */
glfwMakeContextCurrent(window);
//INFECTED LINE OF CODE - START
std::cout << glGetString(GL_VERSION) << std::endl;
glewExperimental=GL_TRUE;
GLenum err=glewInit();
if(err!=GLEW_OK)
{
//Problem: glewInit failed, something is seriously wrong.
std::cout<<"glewInit failed, aborting."<<std::endl;
}
//INFECTED LINE OF CODE - END
/* Loop until the user closes the window */
while (!glfwWindowShouldClose(window))
{
glClear(GL_COLOR_BUFFER_BIT);
glBegin(GL_TRIANGLES);
glVertex2f(-0.5f, -0.5f);
glVertex2f(0.0f, 0.5f);
glVertex2f(0.5f, -0.5f);
glEnd();
glfwSwapBuffers(window);
glfwPollEvents();
}
glfwTerminate();
return 0;
}
我已经正确包含了 GLEW 和 GLFW,并且没有编译错误。是什么原因导致此问题?我该如何解决?感谢您的帮助!
//编辑#1 尝试使用:
(...)
glewExperimental=GL_TRUE;
GLenum err=glewInit();
std::cout<<glewGetErrorString(err);
glewGetErrorString(err);
if(err!=GLEW_OK)
{
//Problem: glewInit failed, something is seriously wrong.
std::cout<<glewGetErrorString(err);
glewGetErrorString(err);
std::cout<<"glewInit failed, aborting."<<std::endl;
}
(...)
当我注释掉受感染的代码行并只留下这一行时:
std::cout << glGetString(GL_VERSION) << std::endl;
我得到输出:
4.6.0 - Build 26.20.100.7637
您不能在
glGetString
之前调用 glewInit
等 OpenGL 函数。 glewInit()
负责从 GPU 驱动程序的 DLL 动态加载这些函数。
如果这样做,您可能会遇到段错误,因为
glGetString
只是一个隐藏未初始化(当时)函数指针的宏。