在SDL 1.3中创建OpenGL 3.2 / 3.x上下文

我遇到了SDL称它不支持OpenGL 3.x上下文的问题。 我正在尝试遵循本教程:在SDL(C / SDL)中创建跨平台OpenGL 3.2上下文。 在这种情况下,我正在使用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)实际上没有做任何事情,在这种情况下,我不知道如何获取创建的适当上下文或更改默认上下文。)

编辑:经过一些测试感谢尼科尔给我的有用的功能,我发现,无论我传递给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。 看来我的程序根本不知道任何更高版本,就好像我根本没有安装它们一样。


因为我不知道你是否已经找到了解决方案,这里是我的:

我今天和昨天用这些东西挣扎了很多。 高级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之前切勿设置版本属性,因为设置属性需要视频后端正确初始化!

我希望这有帮助。


我遵循这个教程。 在windowz和linux上一切正常。 http://people.cs.uct.ac.za/~aflower/tutorials.html

链接地址: http://www.djcxy.com/p/6545.html

上一篇: Creating an OpenGL 3.2/3.x context in SDL 1.3

下一篇: c++