【问题标题】:SDL2 SDL_CreateRenderer downgrades the OpenGL context, can it be prevented?SDL2 SDL_CreateRenderer 降级 OpenGL 上下文,可以防止吗?
【发布时间】:2014-05-25 15:04:37
【问题描述】:

我使用的是 Mac OS (10.9.3)。我可以根据要求创建一个 3.3 上下文的窗口 + 上下文。但是一旦我创建了渲染器,SDL 就会告诉我渲染器是无效的。除此之外,我可以使用渲染器来绘制和复制纹理。但创建渲染器似乎也将 OpenGL 上下文更改为 2.1 配置文件:(

有没有办法防止这种情况发生?

[编辑]

SDL2 和 glew 作为静态库链接。 glewExperimental 未设置为 GL_TRUE。

C++ 源代码:

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);

SDL_GL_SetAttribute(SDL_GL_ACCELERATED_VISUAL, 1);
SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);
SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 24);


h_main_window = SDL_CreateWindow(
    title.c_str(), 
    SDL_WINDOWPOS_CENTERED, 
    SDL_WINDOWPOS_CENTERED, 
    width, 
    height, 
    SDL_WINDOW_OPENGL | SDL_WINDOW_SHOWN
)

SDL_GL_CreateContext(h_main_window)
glewInit()

std::cout << "gl_renderer:" << glGetString(GL_RENDERER) << std::endl;
std::cout << "gl_context: " << glGetString(GL_VERSION) << std::endl;
std::cout << "gl_shading_lang_version: " << glGetString(GL_SHADING_LANGUAGE_VERSION) << std::endl;

SDL_CreateRenderer(
    h_main_window,
    -1,
    SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC | SDL_RENDERER_TARGETTEXTURE
)

std::cout << "gl_renderer:" << glGetString(GL_RENDERER) << std::endl;
std::cout << "gl_context: " << glGetString(GL_VERSION) << std::endl;
std::cout << "gl_shading_lang_version: " << glGetString(GL_SHADING_LANGUAGE_VERSION) << std::endl;

initShaders()

输出:

gl_renderer:Intel HD Graphics 3000 OpenGL Engine
gl_context: 3.3 INTEL-8.24.13
gl_shading_lang_version: 3.30

SDL Error: Invalid renderer

gl_renderer:Intel HD Graphics 3000 OpenGL Engine
gl_context: 2.1 INTEL-8.24.13
gl_shading_lang_version: 1.20
Compile failure in vertex shader:
ERROR: 0:1: '' :  version '330' is not supported
ERROR: 0:3: 'layout' : syntax error syntax error

Compile failure in fragment shader:
ERROR: 0:1: '' :  version '330' is not supported

Linker failure: ERROR: One or more attached shaders not successfully compiled

【问题讨论】:

  • 我认为您没有显示足够的代码来诊断问题。显然有些东西被遗漏了,因为大约一半的行甚至没有以; 结尾。也就是说,SDL_RENDERER_TARGETTEXTURE 是您 显示的 代码唯一不寻常的地方;这可能是回退的原因,您的初始上下文可能缺乏必要的功能。实际上,从头开始,在 OS X 上调用 glewInit (...) 是非常不寻常的。这将在 OS X 上的 3.3 上下文中生成GL_INVALID_ENUM,除非您首先设置glewExperimental = GL_TRUE。顺便说一句,您在 OS X 上不需要 GLEW。
  • 在 MacOS 上使用 OpenGL 3.x 的正确方法是什么? (对于我的设置,glew 初始化有效,GLEW_VERSION_3_3 也是如此)

标签: c++ opengl opengl-3 sdl-2


【解决方案1】:

您遇到的错误可能是一个错误,特别是如果渲染器在报告“无效渲染器”的情况下最终工作正常。

SDL 降低上下文版本的问题是由于渲染器是使用 OpenGL 2.1 调用实现的,因此它需要创建 2.1 GL 上下文。

您可以尝试先创建渲染器,然后设置 SDL_GL_CONTEXT_MAJOR_VERSION 等以创建 3.3 上下文。

【讨论】:

  • 你所说的降级是有道理的。当然,如果没有向后兼容性,渲染器就不能使用核心配置文件。 SDL2 源代码非常易读。我将尝试弄清楚何时设置错误。这可能是由于我的代码设置异常造成的。
猜你喜欢
  • 2017-08-24
  • 1970-01-01
  • 2021-08-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-30
相关资源
最近更新 更多