【发布时间】:2021-09-09 02:46:16
【问题描述】:
我正在尝试获取一个简单的 OpenGL 演示与 SDL2 一起使用。我使用的是 MacOS Big Sur 11.3.1,我的 SDL 版本是 2.0.16,我尝试的 OpenGL 版本是 3.1。
起初一切似乎都很好,因为 SDL 初始化成功,SDL 窗口不为空,OpenGL 上下文也不为空。但是当试图打印出OpenGL的供应商名称、渲染器名称和版本名称时,所有的字符串都是空的:
vendor = (null)
renderer = (null)
version = (null)
这也解释了为什么窗口上没有显示任何内容。我已经学习了大量关于将 SDL2 与 OpenGL 结合使用的教程,但没有一个对我有用。
我是这样编译的:clang -O3 -lSDL2 -lGL gl_sdl.c.
如果有人知道发生了什么,请告诉我;我很迷茫。我的代码如下。
#include <SDL2/SDL.h>
#include <GL/gl.h>
enum {w = 800, h = 600};
#define FAIL(msg) {fprintf(stderr, "Could not " msg "\n"); return 1;}
// https://www.khronos.org/opengl/wiki/Tutorial1:_Creating_a_Cross_Platform_OpenGL_3.2_Context_in_SDL_(C_/_SDL)
// clang -O3 -lSDL2 -lGL gl_sdl.c && ./a.out
int main(void) {
if (SDL_Init(SDL_INIT_VIDEO) < 0) FAIL("initialize SDL");
SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_CORE);
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3);
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 1);
// Turn on double buffering with a 24bit Z buffer. You may need to change this to 16 or 32 for your system
SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);
SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 24);
SDL_Window* const window = SDL_CreateWindow("gl_sdl", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, w, h, SDL_WINDOW_OPENGL);
if (window == NULL) FAIL("create a window");
SDL_GLContext context = SDL_GL_CreateContext(window);
if (context == NULL) FAIL("create a context");
// This makes our buffer swap syncronized with the monitor's vertical refresh
SDL_GL_SetSwapInterval(1);
printf("vendor = %s\nrenderer = %s\nversion = %s\n", glGetString(GL_VENDOR), glGetString(GL_RENDERER), glGetString(GL_VERSION));
SDL_Event event;
while (1) {
while (SDL_PollEvent(&event)) {
if (event.type == SDL_QUIT) {
SDL_GL_DeleteContext(context);
SDL_DestroyWindow(window);
SDL_Quit();
return 0;
}
}
// Blue
glClearColor(0.0f, 0.0f, 1.0f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT);
SDL_GL_SwapWindow(window);
SDL_Delay(20);
}
}
【问题讨论】:
-
我无法重现此内容。您确定正确安装了 OpenGL 库和相应的驱动程序吗?更改参数的顺序是否有帮助,例如:
clang -O3 gl_sdl.c -lSDL2 -lGL? -
SDL_GL_SetAttribute调用是否返回 0? (ref) 请求 OpenGL 3.1 之间存在不匹配,但未使用 OpenGL 加载库,但给定的代码应该仍然有效,因为没有调用 OpenGL >1.1 函数。 -
@Yun 是的,我认为 OpenGL 安装正确,因为我有一个 Hello Triangle 演示并运行 GLFW 和 OpenGL。我还检查了 SDL_GL_SetAttribute 在每次调用中都返回 0,确实如此。
-
如果您将其设置为创建 OpenGL 1.0(或 1.1)上下文,它是否有效?添加和初始化 OpenGL 加载库是否可以正常工作?
-
@Yun 我尝试通过 SDL_GL_CONTEXT_MAJOR_VERSION 和 SDL_GL_CONTEXT_MINOR_VERSION 将版本设置为 1.0 和 1.1,但最终没有任何改变。另外,什么是 OpenGL 加载库?我应该与 SDL2 一起使用吗?
标签: c opengl sdl sdl-2 opengl-3