Попытка загрузить OpenGL 4.1, но получить только OpenGL 2.1 на MacOS

Я пытаюсь настроить проект на основе OpenGL на своем Macbook Pro 14 (процессор M2 Pro, Macos Sonoma 14.5). Мне в основном удалось заставить все работать, НО, что бы я ни делал, я не могу заставить программу использовать вместо этого OpenGL 4.1 и 2.1.

Для этого я использую SDL3, Glad и Zig, но я просто загружаю те же библиотеки, как если бы я использовал C или C++. Вот мой код инициализации:

pub fn initialize_sdl() !SDLComponents {
    c.SDL_Log("Initializing SDL");

    // Very important to set these before initializing SDL
    _ = c.SDL_GL_LoadLibrary(null);
    _ = c.SDL_GL_SetAttribute(c.SDL_GL_ACCELERATED_VISUAL, 1);
    _ = c.SDL_GL_SetAttribute(c.SDL_GL_CONTEXT_FORWARD_COMPATIBLE_FLAG, c.GL_TRUE);
    _ = c.SDL_GL_SetAttribute(c.SDL_GL_CONTEXT_PROFILE_MASK, c.SDL_GL_CONTEXT_PROFILE_CORE);
    _ = c.SDL_GL_SetAttribute(c.SDL_GL_CONTEXT_MAJOR_VERSION, 4);
    _ = c.SDL_GL_SetAttribute(c.SDL_GL_CONTEXT_MINOR_VERSION, 1);
    _ = c.SDL_GL_SetAttribute(c.SDL_GL_DOUBLEBUFFER, 1);
    _ = c.SDL_GL_SetAttribute(c.SDL_GL_DEPTH_SIZE, 24);

    if (c.SDL_Init(c.SDL_INIT_VIDEO) != 0) {
        c.SDL_LogError(c.SDL_LOG_CATEGORY_RENDER, "Unable to initialize SDL: %s", c.SDL_GetError());
        return error.SDLInitializationFailed;
    }

    const window: *c.SDL_Window = c.SDL_CreateWindow("Powder3D", 400, 400, c.SDL_WINDOW_OPENGL | c.SDL_WINDOW_RESIZABLE) orelse {
        c.SDL_LogError(c.SDL_LOG_CATEGORY_RENDER, "Unable to create window: %s", c.SDL_GetError());
        return error.SDLInitializationFailed;
    };

    const open_gl_context: c.SDL_GLContext = c.SDL_GL_CreateContext(window) orelse {
        c.SDL_LogError(c.SDL_LOG_CATEGORY_RENDER, "Unable to create OpenGL context: %s", c.SDL_GetError());
        return error.SDLInitializationFailed;
    };

    if (c.gladLoadGLLoader(sdlGLGetProcAddress) == 0) {
        c.SDL_LogError(c.SDL_LOG_CATEGORY_RENDER, "Unable to load OpenGL functions with glad");
        return error.GLADInitializationFailed;
    }

    const versionStringPtr = c.glGetString(c.GL_VERSION) orelse {
        c.SDL_LogError(c.SDL_LOG_CATEGORY_RENDER, "Could not get GL version");
        return error.OPENGLInitializationFailed;
    };

    const versionString = std.mem.span(versionStringPtr);
    std.debug.print("OpenGL version: {s}\n", .{versionString});

    return .{ .window = window, .context = open_gl_context };
}

Сообщаемая версия open gl (код печатается внизу) выводит «2.1 Metal - 88.1». Пролистав Интернет, большинство людей исправили это, установив значения SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_CORE, но у меня это не работает.

Почему ты пытаешься вызвать SDL_GL_SetAttribute() раньше SDL_Init()?

genpfault 07.07.2024 22:37

Иначе это не сработало. Раньше они были у меня после инициализации, и я думаю, что получил ошибку во время выполнения или что-то в этом роде. Хотя я мог бы попробовать их перетасовать.

Naphat Amundsen 07.07.2024 22:41

@NaphatAmundsen есть лишь несколько функций, которые можно вызывать без предварительного вызова SDL_Init, они не входят в их число. Вам нужно вызвать их перед созданием окна, но после init.

Cubic 08.07.2024 09:30

Хорошо, я просто переместил все SDL_GL_Attribute под SDL_Init, и тогда всё заработало. Я предполагаю, что ошибка, о которой я говорил, была вызвана установкой атрибутов после SDL_GL_CreateContext, и я думаю, я просто переместил ее слишком далеко вверх. Спасибо вам, ребята, большое! Не стесняйтесь, отправьте ответ, и я отмечу его как правильный.

Naphat Amundsen 08.07.2024 20:42
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
4
109
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

SDL_GL_SetAttribute() вызовы должны происходить после SDL_Init(SDL_INIT_VIDEO)/SDL_VideoInit(), но до SDL_CreateWindow(), чтобы быть эффективными:

/**
 * Set an OpenGL window attribute before window creation.
 *
 * This function sets the OpenGL attribute `attr` to `value`. The requested
 * attributes should be set before creating an OpenGL window. You should use
 * SDL_GL_GetAttribute() to check the values after creating the OpenGL
 * context, since the values obtained can differ from the requested ones.
 *
 * \param attr an SDL_GLattr enum value specifying the OpenGL attribute to set
 * \param value the desired value for the attribute
 * \returns 0 on success or a negative error code on failure; call
 *          SDL_GetError() for more information.
 *
 * \since This function is available since SDL 3.0.0.
 *
 * \sa SDL_GL_GetAttribute
 * \sa SDL_GL_ResetAttributes
 */
extern DECLSPEC int SDLCALL SDL_GL_SetAttribute(SDL_GLattr attr, int value);

Другие вопросы по теме