10

我遇到了一个问题,SDL 说它不支持 OpenGL 3.x 上下文。我正在尝试遵循本教程:Creating a Cross Platform OpenGL 3.2 Context in SDL (C / SDL)。在这种情况下,我使用的是 GLEW,但我也无法让 gl3.h 使用它。这是我最终得到的代码:

#include <glew.h>
#include <SDL.h>    

int Testing::init()
        {
            if(SDL_Init(SDL_INIT_EVERYTHING) < 0)
            {
                DEBUGLINE("Error initializing SDL.");
                printSDLError();
                system("pause");
                return 1; // Error
            }

            //Request OpenGL 3.2 context.
            SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3);
            SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 2);

            //set double buffer
            SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);

            //Create window
            window = SDL_CreateWindow("OpenGL 3.2 test",
                SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED,
                600, 400, SDL_WINDOW_OPENGL | SDL_WINDOW_SHOWN);
            if(window == NULL) return 3; // Error

            //Print errors to console if there are any
            printSDLError(__LINE__);

            //Set up OpenGL context.
            glContext = SDL_GL_CreateContext(window);
            printSDLError(__LINE__);
            if(glContext == NULL)
            {
                DEBUGLINE("OpenGL context could not be created.");
                system("pause");
                return 4;
            }

            //Initialize glew
            GLenum err = glewInit();
            if(err != GLEW_OK)
            {
                DEBUGLINE("GLEW unable to be initialized: " << glewGetErrorString(err));
                system("pause");
                return 2;
            }

            return 0; // OK code, no error.
        }

报告的唯一问题是在尝试调用后SDL_GL_CreateContext(window),SDL 报告“不支持 GL 3.x”。但是,本教程和这个示例包(我没有费心测试)都报告说成功地结合了 SDL 1.3 和 OpenGL 3.2。我知道 SDL 1.3 正在开发中,但我有点怀疑即使是无意的支持也会被删除。

仍然会创建一个上下文,并且 GLEW 能够很好地初始化。(我一生无法弄清楚如何查看创建的上下文版本,因为它应该是核心配置文件,我也不知道如何找到它。根据教程,SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3)实际上并没有做任何事情,在这种情况下,我不知道如何创建适当的上下文或更改默认上下文。)

编辑:感谢 Nicol 给我的有用功能,经过一些测试后,我发现,无论我传递给什么参数SDL_GL_SetAttribute,上下文始终是 1.1 版。但是,放入低于 3.0 的任何版本都不会显示不支持的错误。所以问题是SDL看到的“核心”版本只有1.1。

作为记录,我使用的是 Visual C++ 2010 express、GLEW 1.7.0 和最新的 SDL 1.3 修订版。我对使用所有这三个都相当陌生,我必须为 32 位和 64 位版本手动构建 SDL 库,所以有很多可能出错的地方。然而,到目前为止,32 位和 64 位版本的功能完全相同。

编辑:我正在使用带有最新驱动程序的 nVidia 360M GPU,OpenGL Extension Viewer 4.04 报告它与 OpenGL 3.3 完全兼容。

任何帮助表示赞赏。

更新:我已经设法让 SDL 停止对我大喊大叫,说它不支持 3.x 上下文。问题是SDL_GL_SetAttribute必须设置BEFORE SDL_Init的称为:

//Request OpenGL 3.2 context.
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3);
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 2);

//Initialize SDL
if(SDL_Init(SDL_INIT_EVERYTHING) < 0)
{
    DEBUGLINE("Error initializing SDL.");
    return 1; // Error
}

不幸的是,GLEW 仍然拒绝承认高于 OpenGL 1.1 的任何东西(只有 GLEW_VERSION_1_1 返回 true),这仍然让我感到困惑。glGetString(GL_VERSION)还报告 1.1.0。似乎我的程序根本不知道任何更高版本,就好像我根本没有安装它们一样。

4

2 回答 2

14

因为我不知道您是否已经找到解决方案,所以这是我的:

我今天和昨天都在这些东西上挣扎了很多。高级 GL 函数无法使用,所以我什至调试到 opengl32.dll 只是为了看看它确实有效,并将调用包装到特定于硬件的 OpenGL DLL (nvoglnt.dll) 中。所以肯定还有别的原因。互联网上甚至有提示在所有其他库之前链接到 opengl32.lib,因为 ChoosePixelFormat 和其他一些函数相互覆盖。

但这也不是原因。我的解决方案是在此处启用加速视觉效果:

// init SDL
if(SDL_Init(SDL_INIT_VIDEO | SDL_INIT_HAPTIC | SDL_INIT_TIMER) < 0) {       
    fprintf(stderr, "Could not init SDL");
    return 1;
}

// we must wish our OpenGL Version!!
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3);
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 2);
SDL_GL_SetAttribute(SDL_GL_ACCELERATED_VISUAL, 1);

因为在当前的 SDL 修订版(2011 年 12 月 15 日)中,他在 SDL_windowsopengl.c 中检查它

if (_this->gl_config.accelerated >= 0) {
       *iAttr++ = WGL_ACCELERATION_ARB;
        *iAttr++ = (_this->gl_config.accelerated ? WGL_FULL_ACCELERATION_ARB :
                                                   WGL_NO_ACCELERATION_ARB);
   }

如果您没有自行定义,则此属性将初始化为 -1。

并且:在初始化SDL之前千万不要设置版本属性,因为设置属性需要视频后端正确初始化!

我希望这有帮助。

于 2011-12-15T08:48:58.433 回答
3

我按照本教程进行操作。在windowz和linux上一切正常。 http://people.cs.uct.ac.za/~aflower/tutorials.html

于 2011-11-14T04:04:43.260 回答