首页 > 解决方案 > SDL_GL_ExtensionsSupported 总是返回 SDL_False

问题描述

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

我在 KUbuntu 16.04,还想支持其他平台,

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

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

如果我问 glewinfo:

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

我正在打开一个窗口:

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;
}

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

无法加载 glCompileShader

指示SDL_ExtensionSupported("glCompileShader")返回 SDL_False ...

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

标签: copenglsdlsdl-2

解决方案


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

GL 扩展字符串通常如下所示:GL_EXT_framebuffer_blit

glShaderSourceARB由 OpenGL 2.0添加,ARB_shader_objects但一直是核心功能。

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


推荐阅读