SDL_GL_ExtensionsSupported总是returnsSDL_False

SDL_GL_ExtensionsSupported alway returns SDL_False

根据 SDL2 文档,加载 OpenGL 扩展时,您应该始终询问是否支持该扩展。参见:https://wiki.libsdl.org/SDL_GL_GetProcAddress

我用的是KUbuntu 16.04,还想支持其他平台,

目前我总是得到一个指向扩展的有效指针,但是 SDL_GL_ExtensionSupported 总是告诉我它不受支持。

我使用 CMake 通过 FindPackage(OpenGL REQUIRED) 找到 opengl 库,然后通过 link 找到它们。 target_link_libraries(MyTarget ${OPENGL_gl_LIBRARIES})

如果我问 glewinfo:

$glewinfo | grep -i glcompileshader
  glCompileShader:                                             OK
  glCompileShaderARB:                                          OK
  glCompileShaderIncludeARB:                                   OK

我正在打开一个window:

SDL_Window* window;
SDL_GLContext context;
int flags =  SDL_WINDOW_RESIZABLE|SDL_WINDOW_OPENGL|SDL_WINDOW_SHOWN;
window = SDL_CreateWindow("name", x, y, z, flags);
context = SDL_GL_CreateContext(window);

然后我打电话给allocate_glextension_for_context(context); 来自下面的片段。

// casting function pointers generates pedantic errors
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wpedantic"

#define LOAD_AND_CHECK_EXTENSION(name)                              \
    ext->name = (ext_##name) SDL_GL_GetProcAddress(#name);          \
    if (ext->name != NULL) {                                        \
        if (SDL_GL_ExtensionSupported(#name) != SDL_TRUE) {         \
            ext->name = NULL;                                       \
            failed_to_load = 1;                                     \
            fprintf(stderr, "failed to load %s\n", #name);          \
        }                                                           \
    }                                                               \


/**
 * \brief This function loads the extensions for a given context.
 *
 * @param [in] The SDL_GLContext that should be active.
 * @param extensions The set of extensions.
 * @return PSY_GL_LOAD_OK if everything is alright.
 */
static int
load_extentions(GLExtensions* ext)
{
    int failed_to_load = 0;

    // Here below we load functions from the opengl library via SDL2
    // via a macro, this is roughly what it does.
    ext->glShaderSource  = SDL_GL_GetProcAddress("glShaderSource");
    if (ext->glShaderSource != NULL) {
        if (SDL_GL_ExtensionSupported("glShaderSource") != SDL_TRUE) {
            ext->glShaderSource = NULL;
            failed_to_load = 1;
        }
    }

    // Is already done here above.
    //LOAD_AND_CHECK_EXTENSION(glShaderSource);
    LOAD_AND_CHECK_EXTENSION(glCompileShader);
    LOAD_AND_CHECK_EXTENSION(glGetShaderiv);
    LOAD_AND_CHECK_EXTENSION(glGetShaderInfoLog);

    if (failed_to_load)
        return PSY_GL_LOAD_EXTENSION_MISSING;
    else
        return PSY_GL_LOAD_OK;
}

//reenable all warnings
#pragma GCC diagnostic pop

int
allocate_glextension_for_context(SDL_GLContext context)
{
    ExtensionPair pair = {
        .context = context,
        .extensions = {0}
    };

    int ret;
    if (context != SDL_GL_GetCurrentContext())
        return PSY_GL_LOAD_CONTEXT_NOT_CURRENT;

    if (g_array) {
        for (size_t i = 0; i < see_dynamic_array_size(g_array); i++) {
            ExtensionPair* pair = see_dynamic_array_get(g_array, i);
            if (pair->context == context)
                return PSY_GL_LOAD_CONTEXT_EXISTS;
        }
    }
    else {
        ret = see_dynamic_array_new(
            &g_array,
            sizeof (ExtensionPair),
            NULL,
            NULL,
            NULL
            );
        if (ret != SEE_SUCCESS)
            return PSY_GL_LOAD_NO_MEMORY;
    }

    ret = load_extentions(&pair.extensions);
    if (see_dynamic_array_add(g_array, &pair) != SEE_SUCCESS)
        return PSY_GL_LOAD_NO_MEMORY;

    return ret;
}

如果我 运行 我总是得到代码和许多其他代码:

failed to load glCompileShader

表示SDL_ExtensionSupported("glCompileShader")returnsSDL_False...

但是,上面我显示glew表示这些扩展都是支持的。我做错了什么?

没有名为“glShaderSource”的扩展程序。

GL extension strings generally look something 这样:GL_EXT_framebuffer_blit

glShaderSourceARBARB_shader_objects 添加,但自 OpenGL 2.0 以来一直是核心功能。

除非您的目标是 2.0 之前的 GL 实现并且实际上计划支持 ARB 入口点,否则我建议改为进行 GL 版本检查。