c++ - SDL2 SDL_CreateRenderer 降级OpenGL 上下文,是否可以阻止?

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

我使用的是 Mac 操作系统 (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 降低上下文版本的问题是由于渲染器是使用 OpenGL 2.1 调用实现的,因此它需要创建 2.1 GL 上下文。

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

关于c++ - SDL2 SDL_CreateRenderer 降级OpenGL 上下文,是否可以阻止?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23856662/

相关文章:

c++ - SDL2 OpenGL3 如何在函数内初始化 SDL

c++ - 如何将 for_each 与作为重载 operator() 的函数一起使用

opengl - glReadPixels 不将数据写入数组

c++ - 一种检测进程是否崩溃(或停止)的简单方法?

Qt5.6:高DPI支持和OpenGL(OpenSceneGraph)

visual-c++ - bmp 图像格式可以处理透明度吗

c++ - 在 OpenGL 中用极坐标绘制正方形

c++ - 如果我将 glUniform1f 调用放在渲染循环之前,则不会存储统一值

c++ - std::mem_fn 与 hand-rolled 仿函数相比的缺陷

c++ - 提取证书中主题属性的所有值