初始化GLEW失败。缺少GL版本。

29
我尝试在最新版本的Qt Creator中设置SFML 2.0,我已经正确地设置了SFML并导入了我在Visual Studio中编写的小游戏。编译时,我遇到了这个错误:enter image description here我所尝试的
  • 从头重新安装整个qt SDK和qt creator IDE
  • 重新安装SFML
  • 重新安装mingw
  • 我尝试编写一个简单的程序以确保不是我的代码问题,该程序可以正确编译,但当我关闭应用程序时,会出现OpenGL错误,这是不正常的
  • 我试图在SFML论坛上发布一个主题帖,但没有成功。
  • 谷歌搜索错误会显示一些与OpenGL有关的结果,但这些结果太具体化了,与我无关,没有解决SFML 2.0中发生的问题。
其他细节
  • 我正在运行Windows XP SP3,mingw和qt SDK和SFML的最新版本
  • 我尝试使用的代码在Visual Studio 2010和Code :: Blocks上都可以正常工作,没有错误或警告
  • 是的,我确定我的IDE已经设置了SFML,基本代码可以工作,但会显示这些错误,更高级的代码会将所有精灵和文本显示为框。
  • 我没有编译SFML自己
  • 我的gcc版本是4.6.2
  • 我的gcc是DW2版本
我找不到任何结果,甚至不知道如何接近修复此问题,甚至不知道从哪里开始。我不能展示所有的代码,它超过了20个文件,而且我很确定其中不是我的代码。正如我之前所说:除了Qt Creator外,在任何集成开发环境中,我都可以运行这段代码而不会收到任何警告或错误。


1
你的代码初始化有问题。当GLContext无效时,GLEW会抛出此错误。检查你的初始化中对象的生命周期,确保在初始化GLEW之前SFML没有被释放。 - dans3itz
@dans3itz 这不可能是我的代码问题,我已经在几乎所有的IDE上都测试过了,SFML从来没有这样做过,通常它会自己处理OpenGL的问题,而无需我担心。 - Bugster
错误是GLEW_ERROR_NO_GL_VERSION - 这意味着GLContext要么A)未加载,B)不再有效 - 在调用glewInit()之前需要创建和验证GL上下文;不确定自从您搬家以来发生了什么变化,但我相信这是一些愚蠢的事情,因为它非常令人沮丧:D - dans3itz
在SFML中编写一个hello world程序会显示相同的错误。肯定不是代码的问题,我确定这也是一些愚蠢的东西,但我甚至无法远程想出错在哪里。 - Bugster
4
@Bugster:接下来发布“Hello World”程序。 - Nicol Bolas
6个回答

30
因为您没有初始化OpenGL。使用glut库的示例。
错误的代码:
 glewInit();  // ERROR MISSING GL VERSION
 glutInitDisplayMode(GLUT_RGB); 

好的:

 glutInitDisplayMode(GLUT_RGB);
 glewInit();

编辑 我认为对于SFML:

 sf::Window   App(sf::VideoMode(400, 400, 32), "Window");
 glewInit();

编辑 2 测试此代码。

#include <SFML/Window.hpp>
#include <iostream>
#include <GL/glew.h>

int
main(int, const char**)
{
    GLenum      err;

    std::cout << "Start" << std::endl;
    std::cout << "Test 1" << std::endl;
    if ((err = glewInit()) != GLEW_OK)
        std::cout << glewGetErrorString(err) << std::endl;

    std::cout << "Init window" << std::endl;
    sf::Window  app(sf::VideoMode(400, 400, 32), "Windows");

    std::cout << "Test 2" << std::endl;
    if ((err = glewInit()) != GLEW_OK)
        std::cout << glewGetErrorString(err) << std::endl;
    std::cout << "End" << std::endl;
    return 0;
}

我的输出:

Start
Test 1
Missing GL version
Init window
Test 2
End

使用以下命令进行编译:g++ -W -Wall -Werror main.cpp -lsfml-window -lGLEW 祝你好运 ;)

我不应该初始化它,SFML 应该为我完成这个任务。我正在使用一个库来初始化 openGL,但我不知道如何在 OpenGL 中工作,但我知道如何在 SFML 中工作,由于这个错误,它无法正常工作。 - Bugster
3
通过将上述解决方案中的 glutInitDisplayMode(GLUT_RGB); 修改为 glutInit(&argc, argv); 并添加 glutCreateWindow("GLEW Test");,我得到了 GLEW_OK。希望这能有所帮助~ - Siu Ching Pong -Asuka Kenji-
17
对于使用GLFW而不是SFML的用户,您需要在glfwMakeContextCurrent之后调用glewInit()。 - Syler
2
@syler 应该将您的评论作为一个单独的问答发布;吃掉了我的时间!! - user3648895
@Syler,您先生是WinRar。 - Katianie

8

根据用户3648895的要求,我将我的答案单独发布在评论之外。

对于使用GLFW而不是SFML的用户,需要在glfwMakeContextCurrent后调用glewInit()。


7

2
你可以通过包含对问题原因的描述以及你的回答如何解决该问题来提高你的回答质量。 - toonice

1
在sf::window创建之后放置glewInit();可以解决我使用glew和sfml遇到的问题。

1
对于使用SDL2的渲染器函数的用户,需要在SDL_CreateRenderer之后立即进行。

SDL_CreateRenderer不是用于OpenGL,对吧?因为对于GL,您需要创建一个上下文。 - Hugius
我的代码中没有SDL_CreateRenderer调用,但这是一个有用的提示。glew初始化必须在一些SDL创建之后调用。 - Benedikt S. Vogler

1

在GLEW的文档中明确提到:

"首先,您需要创建一个有效的OpenGL渲染上下文,并调用glewInit()来初始化扩展入口点。如果glewInit()返回GLEW_OK,则初始化成功,您可以使用可用的扩展以及核心OpenGL功能"

如果您正在使用GLFW,则必须在"glfwMakeContextCurrent(window)"之后调用此函数。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接