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

前端之家收集整理的这篇文章主要介绍了c – 在SDL 1.3中创建OpenGL 3.2 / 3.x上下文前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正面临一个问题,SDL说它不支持OpenGL 3.x上下文.我试图遵循这个教程: Creating a Cross Platform OpenGL 3.2 Context in SDL (C / SDL).在这种情况下,我使用GLEW,但是我也无法使用gl3.h来处理这个问题.这是我最终的代码
  1. #include <glew.h>
  2. #include <SDL.h>
  3.  
  4. int Testing::init()
  5. {
  6. if(SDL_Init(SDL_INIT_EVERYTHING) < 0)
  7. {
  8. DEBUGLINE("Error initializing SDL.");
  9. printSDLError();
  10. system("pause");
  11. return 1; // Error
  12. }
  13.  
  14. //Request OpenGL 3.2 context.
  15. SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION,3);
  16. SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION,2);
  17.  
  18. //set double buffer
  19. SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER,1);
  20.  
  21. //Create window
  22. window = SDL_CreateWindow("OpenGL 3.2 test",SDL_WINDOWPOS_CENTERED,600,400,SDL_WINDOW_OPENGL | SDL_WINDOW_SHOWN);
  23. if(window == NULL) return 3; // Error
  24.  
  25. //Print errors to console if there are any
  26. printSDLError(__LINE__);
  27.  
  28. //Set up OpenGL context.
  29. glContext = SDL_GL_CreateContext(window);
  30. printSDLError(__LINE__);
  31. if(glContext == NULL)
  32. {
  33. DEBUGLINE("OpenGL context could not be created.");
  34. system("pause");
  35. return 4;
  36. }
  37.  
  38. //Initialize glew
  39. GLenum err = glewInit();
  40. if(err != GLEW_OK)
  41. {
  42. DEBUGLINE("GLEW unable to be initialized: " << glewGetErrorString(err));
  43. system("pause");
  44. return 2;
  45. }
  46.  
  47. return 0; // OK code,no error.
  48. }

报告的唯一问题是尝试调用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必须在SDL_Init被调用之前设置:

  1. //Request OpenGL 3.2 context.
  2. SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION,3);
  3. SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION,2);
  4.  
  5. //Initialize SDL
  6. if(SDL_Init(SDL_INIT_EVERYTHING) < 0)
  7. {
  8. DEBUGLINE("Error initializing SDL.");
  9. return 1; // Error
  10. }

不幸的是,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和一些其他函数被彼此覆盖.

但这不是原因.我的解决方案是在这里启用加速的视觉效果

  1. // init SDL
  2. if(SDL_Init(SDL_INIT_VIDEO | SDL_INIT_HAPTIC | SDL_INIT_TIMER) < 0) {
  3. fprintf(stderr,"Could not init SDL");
  4. return 1;
  5. }
  6.  
  7. // we must wish our OpenGL Version!!
  8. SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION,2);
  9. SDL_GL_SetAttribute(SDL_GL_ACCELERATED_VISUAL,1);

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

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

并且如果您没有自己定义该属性,则此属性将初始化为-1.

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

我希望这有帮助.

猜你在找的C&C++相关文章