【发布时间】:2014-07-08 02:28:16
【问题描述】:
我正在尝试在 SDL_Window 上初始化 OpenGL 上下文。
问题是,当我尝试执行 glewInit() 时,它无法初始化并给出错误消息“缺少 OpenGL 版本”。
我在 Google 上翻了一下,似乎这个错误要么在 OpenGL 上下文未初始化时出现,或者更具体地说,对于 SDL,在 SDL_GL_MakeCurrent 未将上下文设为当前时出现。
值得一提的是,这里使用的 SDL/OpenGL 对象(gi_window, gi_glcontext) 是GameInstance 类中的公共变量。
我的 OpenGL 版本是 3.0,我的 SDL 版本是 2.0.3,我的 GLEW 版本是 1.10-2。
使用的系统是 64 位 Arch Linux(因此安装了上述库的 64 位版本)。
初始化代码
#include "../headers/init.h"
GameInstance::GameInstance(int p_fps, int p_height, int p_width, const char* p_wtitle)
{
gi_fps = p_fps;
if(SDL_Init(SDL_INIT_EVERYTHING) < 0)
{
std::cerr << "SDL Error(something about the init):" << SDL_GetError() << std::endl;
}
gi_window = SDL_CreateWindow(p_wtitle,
SDL_WINDOWPOS_UNDEFINED,
SDL_WINDOWPOS_UNDEFINED, p_width, p_height,
SDL_WINDOW_OPENGL | SDL_WINDOW_SHOWN);
if(gi_window == NULL)
{
std::cerr << "SDL Error(couldn't create window): " << SDL_GetError() << std::endl;
}
SDL_GL_SetAttribute ( SDL_GL_CONTEXT_MAJOR_VERSION , 3 ) ;
SDL_GL_SetAttribute ( SDL_GL_CONTEXT_MINOR_VERSION , 0 ) ;
gi_glcontext = SDL_GL_CreateContext(gi_window);
if(gi_glcontext == NULL)
{
std::cerr << "SDL Error(something about glcontext): " << SDL_GetError() << std::endl;
}
std::cout << glGetString(GL_VERSION) << std::endl;
if(SDL_GL_MakeCurrent(gi_window, gi_glcontext) < 0)
{
std::cerr << "SDL Error(something about glcontext): " << SDL_GetError() << std::endl;
}
glewExperimental = GL_TRUE;
GLenum glewerror = glewInit();
if(glewerror =! GLEW_OK)
{
std::cerr << "GLEW Error(something about the initilazation): " << glewGetErrorString(glewerror) << std::endl;
}
SDL_version compiled;
SDL_GetVersion(&compiled);
printf("SDL Version: %d.%d.%d\n",compiled.major, compiled.minor, compiled.patch); //
SDL_Delay(200000);
}
编辑:
看来Missing OpenGL Version在没有设置glewExperimental的时候也会出现另一个原因,因为只有glew的实验版支持3.0+
我已经正确设置了 glewExperimental(至少从我从在线示例中收集到的),但它仍然给了我Missing OpenGL Version。
编辑 2:
代码here 确实不会抛出Missing OpenGL version,尽管它与我的非常相似。
编辑 3:
根据 enhzflep 的建议,我重写了代码以尝试诊断发生了什么。
错误不会缓解。
#include <SDL2/SDL.h>
#include <SDL2/SDL_version.h>
#include <GL/glew.h>
#include <iostream>
int main()
{
SDL_Init(SDL_INIT_EVERYTHING);
SDL_Window* gi_window = SDL_CreateWindow("I would love for this to work!",
SDL_WINDOWPOS_UNDEFINED,
SDL_WINDOWPOS_UNDEFINED, 640, 480,
SDL_WINDOW_OPENGL | SDL_WINDOW_SHOWN);
SDL_GLContext gi_glcontext = SDL_GL_CreateContext(gi_window);
SDL_GL_MakeCurrent(gi_window, gi_glcontext);
SDL_GL_SetAttribute ( SDL_GL_CONTEXT_MAJOR_VERSION , 3 );
SDL_GL_SetAttribute ( SDL_GL_CONTEXT_MAJOR_VERSION , 0 );
glewExperimental = GL_TRUE;
GLenum glewerror = glewInit();
if(glewerror =! GLEW_OK)
{
std::cerr << "GLEW Error(something about the initilazation): " << glewGetErrorString(glewerror) << std::endl;
}
}
【问题讨论】:
-
囊性纤维化只要求组成我们 DNA 的序列中大约 2 或 3 个字母不同 - 这通常是致命的情况。然而,我们可以拥有数百或数千个与其他人不同的基因而不会产生不良影响。关键是-有些事情是至关重要的,而有些则不是。将您的代码精简为一个功能最少的程序,然后从那里开始。
-
感谢您的回复,但我已经从头重写了这段代码;即使删除了错误处理(当然,
glewInit()除外),问题仍然存在。 -
在编辑 3 中,您的
SDL_Init()去哪儿了?这有点重要。 -
您的所有代码都令人困惑。您的新代码缺少
SDL_Init()调用。但它试图在上下文创建后设置 GL 上下文版本,这将不起作用。您的原始代码使用正确的顺序。这可能是它失败的原因。也许您没有 GL3 支持。您链接的示例也有错误的顺序,因此您可能会在那里获得旧版上下文。 -
@derhass,@genpfault 啊,是的,我有一个不包括 SDL_Init 的脑残。我应该有 GL3 支持,至少就
glGetString(GL_VERSION)告诉我的(它输出3.0 Mesa 10.2.2)而言。