无法在 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
似乎仍然有效(window 具有选择的任何背景颜色)。
- 没有出现渲染(我正在使用 OpenGL SuperBible ‘GLTools’ code 进行渲染,这应该只使用 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 Core 上下文获取 OpenGl SuperBible 示例,我在后面的章节中发现它们故意针对兼容性配置文件,因此本书可以在更早的系统上运行。这解释了上面的第 1 点,很遗憾他们在描述如何开始时没有预先提供此信息!
我有以下使用 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
似乎仍然有效(window 具有选择的任何背景颜色)。- 没有出现渲染(我正在使用 OpenGL SuperBible ‘GLTools’ code 进行渲染,这应该只使用 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 Core 上下文获取 OpenGl SuperBible 示例,我在后面的章节中发现它们故意针对兼容性配置文件,因此本书可以在更早的系统上运行。这解释了上面的第 1 点,很遗憾他们在描述如何开始时没有预先提供此信息!