OpenGL 3.1与SDL2上下文在MacOS上无法在屏幕上输出任何内容。

3

我正在尝试在SDL2中使用OpenGL的简单演示。我使用的是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,看是否有所帮助? - Yun
@Yun 是的,我认为OpenGL已经正确安装了,因为我使用GLFW和OpenGL编写了一个Hello Triangle演示程序。我还检查了每个调用中SDL_GL_SetAttribute返回值是否为0,结果都是这样。 - Caspian Ahlberg
如果将其设置为创建OpenGL 1.0(或1.1)上下文,它是否有效?添加并初始化OpenGL加载库是否使其有效? - Yun
@Yun 我尝试通过SDL_GL_CONTEXT_MAJOR_VERSION和SDL_GL_CONTEXT_MINOR_VERSION将版本设置为1.0和1.1,但最终没有任何变化。另外,什么是OpenGL加载库?我是否应该与SDL2一起使用它? - Caspian Ahlberg
让我们在聊天中继续这个讨论 - Yun
显示剩余4条评论
1个回答

2

MacOS使用与Linux和Windows不同的OpenGL库标志。不要使用-lGL,而是使用-framework OpenGL。例如:

clang -O3 gl_sdl.c -lSDL2 -framework OpenGL

顺便提一下,该程序请求OpenGL 3.1的上下文,但没有使用OpenGL Loading Library(或手动加载任何函数)。目前来看,这并没有引起任何问题,只是因为没有使用OpenGL >1.1的任何函数。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接