无法在OSX 10.11(MBP,GeForce 750M)上使用SDL2创建可工作的OpenGL 3.3上下文
Cannot create working OpenGL 3.3 context with SDL2 on OSX 10.11 (MBP, GeForce 750M)
我使用SDL2:为OpenGL提供了以下(工作)设置代码
int main(int argc, char* argv[])
{
SDL_SetMainReady();
if (SDL_Init(SDL_INIT_VIDEO) != 0) return 1);
SDL_GL_SetAttribute(SDL_GL_RED_SIZE, 8);
SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE, 8);
SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE, 8);
SDL_GL_SetAttribute(SDL_GL_ALPHA_SIZE, 8);
SDL_GL_SetAttribute(SDL_GL_BUFFER_SIZE, 32);
SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);
SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 16);
SDL_GL_SetAttribute(SDL_GL_ACCELERATED_VISUAL, 1);
SDL_GL_SetAttribute(SDL_GL_CONTEXT_FLAGS, SDL_GL_CONTEXT_FORWARD_COMPATIBLE_FLAG);
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 2);
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 1);
auto sdl_window = SDL_CreateWindow("GL Experiment",
SDL_WINDOWPOS_CENTERED, // x position.
SDL_WINDOWPOS_CENTERED, // y position.
640, // Width.
640, // Height.
SDL_WINDOW_HIDDEN | SDL_WINDOW_OPENGL);
if (sdl_window == nullptr) return 2;
auto sdl_gl_context = SDL_GL_CreateContext(sdl_window);
if (sdl_gl_context == nullptr) return 3;
...
但是,如果我将SDL_GL_CONTEXT_VERSION...
行更改为:
// Use a core profile setup.
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3);
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 3);
SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_CORE);
然后它以一种奇怪的方式断裂:
- 程序不会因错误而崩溃/退出
glClear
看起来仍然有效(窗口具有所选择的任何背景颜色)- 没有显示渲染(我正在使用OpenGL SuperBible"GLTools"代码来进行渲染,它应该只使用Core Profile调用,并与2.1上下文一起使用)
上下文报告的属性中有一些奇怪之处:
SDL_GL_RED_SIZE: 0 SDL_GL_GREEN_SIZE: 0 SDL_GL_BLUE_SIZE: 0 SDL_GL_ALPHA_SIZE: 0 SDL_GL_BUFFER_SIZE: 4 SDL_GL_DOUBLEBUFFER: 1 SDL_GL_DEPTH_SIZE: 0 SDL_GL_STENCIL_SIZE: 0 SDL_GL_ACCUM_RED_SIZE: 0 SDL_GL_ACCUM_GREEN_SIZE: 0 SDL_GL_ACCUM_BLUE_SIZE: 0 SDL_GL_ACCUM_ALPHA_SIZE: 0 SDL_GL_STEREO: 0 SDL_GL_MULTISAMPLEBUFFERS: 0 SDL_GL_MULTISAMPLESAMPLES: 0 SDL_GL_ACCELERATED_VISUAL: 1 SDL_GL_CONTEXT_MAJOR_VERSION: 3 SDL_GL_CONTEXT_MINOR_VERSION: 3 SDL_GL_CONTEXT_FLAGS: 2 SDL_GL_CONTEXT_PROFILE_MASK: 1 SDL_GL_SHARE_WITH_CURRENT_CONTEXT: 0 SDL_GL_FRAMEBUFFER_SRGB_CAPABLE: 0
因此上下文声称具有0位颜色位深度等。不过,这似乎与最初的glClear
调用的渲染不一致,后者很乐意以颜色渲染。
我检查了一些OpenGL函数,它们似乎可以解析为真实的函数地址(只是使用OSX的<opengl/gl3.h>
来获取这些地址,但我检查了一下,它们与通过SDL加载函数指针的地址相同。
更新
glGetString的输出为:
GL_VENDOR: NVIDIA Corporation
GL_RENDERER: NVIDIA GeForce GT 750M OpenGL Engine
GL_VERSION: 4.1 NVIDIA-10.6.47 310.42.05f01
GL_SHADING_LANGUAGE_VERSION: 4.10
这是请求3.3/Core的时候,所以很明显它给出了4.1的上下文。当请求2.1时,它是相同的,但正确地显示GL_VERSION: 2.1 ...
。
事实证明OpenGL上下文已经成功创建,即上述代码在创建上下文方面运行良好。
因此,问题似乎有两个方面:
- OpenGL SuperBible(第5版)绘图代码必须包含兼容性配置文件代码形式的错误,该错误会阻止实际渲染工作
- SDL 2.0.4或其使用的底层OSX方法在报告创建的上下文的位深度等时似乎包含错误
更新
在前几章中,我花了一些时间在3.3核心上下文中获得了OpenGl SuperBible的例子,在后一章中我发现,他们故意针对兼容性配置文件,这样这本书就可以在早期的系统上使用了。这解释了上面的第1点,很遗憾他们在描述如何开始时没有提前提供这些信息!
相关文章:
- 如何创建一个CMake变量,除非显式重写,否则使用默认值
- 使用std::multimap迭代器创建std::list
- 在全局变量中保存类的实例以重新创建类(创建"backup")
- 使用CMake创建QML插件
- 如何在c++中为模板函数实例创建快捷方式
- 如何创建事件驱动的 SDL2 应用程序
- 在使用 SDL2 从曲面创建的纹理上渲染纹理
- SDL2 不将在单独函数中创建的图像渲染到SDL_RenderPresent (C++)
- SDL2 无法创建窗口,因为它找不到匹配的 GLX 视觉对象
- SDL2-从Surface(屏幕快照)创建纹理的问题
- 创建一个可部署的CMake动态SDL2应用程序
- 创建一个包含矩形的窗口,其中包含一个带有 C++ 和 SDL2 的矩形
- SDL2 - 检查是否创建了 OpenGL 上下文
- 与节点FFI创建SDL2操纵杆绑定的问题
- 无法在OSX 10.11(MBP,GeForce 750M)上使用SDL2创建可工作的OpenGL 3.3上下文
- SDL2 SIGSEGV从曲面创建纹理
- SDL2,创建比屏幕大的窗口
- SDL2程序只工作,如果Renderer是用SDL_RENDERER_SOFTWARE创建的
- Visual Studio和SDL2窗口创建失败
- SDL2 创建渲染器抛出无效窗口错误