在 SDL 1.3 中创建 OpenGL 3.2/3.x 上下文
Posted
技术标签:
【中文标题】在 SDL 1.3 中创建 OpenGL 3.2/3.x 上下文【英文标题】:Creating an OpenGL 3.2/3.x context in SDL 1.3 【发布时间】:2011-12-27 22:41:18 【问题描述】:我遇到了一个问题,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”。然而,本教程和这个sample pack(我没有费心测试)都报告了将 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。看来我的程序根本不知道任何更高版本,就好像我根本没有安装它们一样。
【问题讨论】:
你有没有想过是你的显卡/驱动不支持GL 3.x?在任何情况下,您都可以使用通常的方法来获取上下文的 GL 版本(glGetString(GL_VERSION)
)。
我有,我忘了提到这个重要的细节。编辑后,我使用的是支持 OpenGL 3.3 的 nVidia 360M。我会在它创建的上下文中添加你给我的函数,谢谢。
经过一番挖掘,我的程序似乎只看到了 OpenGL 1.1。这可能只是一切的软件后备。所以这个问题实际上只是一个更大问题的症状。
如果您删除 SDL 属性并尝试正常创建 GL 上下文会发生什么?
@NicolBolas 发生同样的事情,创建了 1.1 上下文。我运行了 GLEW 1.7 附带的 glewinfo.exe,它还报告说它支持 OpenGL 3.3。从字面上看,我电脑上的一切都在说它应该可以工作,但它只会在我的程序中失败。会不会是我链接的东西不正确?
【参考方案1】:
因为我不知道你是否已经找到了解决方案,这里是我的:
我今天和昨天都在这些东西上挣扎了很多。高级 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之前设置版本属性,因为设置属性需要视频后端正确初始化!
我希望这会有所帮助。
【讨论】:
谢谢我遇到了完全相同的问题,这对我来说就像一个魅力。【参考方案2】:我按照本教程进行操作。在windowz和linux上一切正常。 http://people.cs.uct.ac.za/~aflower/tutorials.html
【讨论】:
好吧,教程本身对我没有任何帮助。但是,它提供的代码给了我一个新的 SDL.dll,这与我自己编译的有很大不同。使用提供的而不是我自己构建的,我设法创建了一个 3.2 上下文! (但是,出于某种原因,Glew 只报告了 3.0 的成功)。事实证明,我没有正确构建我的 SDL DLL。不过谢谢!我终于走上了正轨,我会相应地更新主帖。以上是关于在 SDL 1.3 中创建 OpenGL 3.2/3.x 上下文的主要内容,如果未能解决你的问题,请参考以下文章
使用 SDL2 和 xcode 4.6。我设法创建了一个 OpenGL 3.2 核心上下文。但是不能使用 glsl 1.50