创建OpenGL 3.2/3.SDL 1.3中的x上下文
Creating an OpenGL 3.2/3.x context in SDL 1.3
我面临一个问题,SDL说它不支持opengl3。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)
实际上不做任何事情,在这种情况下,我不知道如何创建适当的上下文或更改默认上下文。
编辑:由于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扩展查看器4.04报告具有完全兼容性到OpenGL 3.3。
任何帮助都是感激的。
UPDATE:我已经设法让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的任何东西(只有gleew_version_1_1返回true),这仍然让我感到困惑。glGetString(GL_VERSION)
也报告1.1.0。似乎我的程序根本不知道有更高的版本,就好像我根本没有安装它们一样。
由于我不知道你是否已经找到了解决方案,这里是我的解决方案:
我挣扎了很多今天和昨天的东西。高级GL函数无法使用,所以我甚至调试到opengl32.dll中,只是为了看看它是否真的有效,并将调用包装到特定硬件的OpenGL DLL (noglt . DLL)中。所以肯定有别的原因。互联网上甚至有链接到opengl32的提示。因为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之前设置版本属性,因为设置属性需要正确初始化视频后端!
我遵循了这个教程。在windows和linux上一切正常。http://people.cs.uct.ac.za/aflower/tutorials.html
- 我的文件无法正常工作,无法从C++文件中读取上下文
- 非推导上下文,如标准库中的"boost::mpl::identity:<T>:type"?
- 如何在 v8 Javascript 中的多个函数中使用相同的上下文?
- 如何在C++上的多个继承上下文上使用特定基类中的运算符
- 当删除上下文属性中的QLIST对象时,QT QML应用程序崩溃
- 是 SFINAE 中直接上下文的异常规范部分
- SetPixelFormat() 中的第三个参数对于 OpenGL 上下文创建有什么意义?
- 访问Lambdas中的外部上下文
- c++:模板中不合格名称查找的上下文
- 如何更新C 中已使用TrackPopupMenu显示的上下文菜单
- 如何在GLFW 3中的源文件之间共享窗口上下文
- 右键单击系统托盘图标,然后单击C 中的上下文菜单
- 将菜单项添加到Windows Explorer右键单击Java中的上下文菜单
- 如何在Qt中获取文件系统操作的上下文菜单
- 是否可以在Qt中的顶级窗口之间使用相同的OpenGL上下文
- 系统存储中的证书上下文总是有一个无效的pbCertEncoded指针
- 如何在不同的上下文(例如线程)中保留原始异常类型信息
- 为什么 WinAPI 中的上下文(弹出)菜单没有出现?
- 创建OpenGL 3.2/3.SDL 1.3中的x上下文
- OpenCL - c++包装器-动态库中的上下文取消初始化导致访问冲突