KSc*_*orp 10 c++ opengl sdl opengl-3
我遇到的问题是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.
}
Run Code Online (Sandbox Code Playgroud)
报告的唯一问题是在尝试呼叫之后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
}
Run Code Online (Sandbox Code Playgroud)
不幸的是,GLEW仍然拒绝承认任何高于OpenGL 1.1的东西(只有GLEW_VERSION_1_1返回true),这仍然让我感到困惑.glGetString(GL_VERSION)
还报告1.1.0.似乎我的程序根本不知道任何更高版本,好像我根本没有安装它们.
and*_*ten 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);
Run Code Online (Sandbox Code Playgroud)
因为在当前的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);
}
Run Code Online (Sandbox Code Playgroud)
如果您没有自己定义,则此属性初始化为-1.
并且:在初始化SDL之前不要设置版本属性,因为设置属性需要正确初始化视频后端!
我希望这有帮助.
归档时间: |
|
查看次数: |
11246 次 |
最近记录: |