代码之家  ›  专栏  ›  技术社区  ›  hetepeperfan

sdl_gl_扩展支持始终返回sdl_false

  •  1
  • hetepeperfan  · 技术社区  · 7 年前

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

    我在Kubuntu 16.04,但也想支持其他平台,

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

    我使用cmake通过 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表明这些扩展都受支持。我做错了什么?

    1 回复  |  直到 7 年前
        1
  •  3
  •   genpfault    7 年前

    没有叫分机” glShaderSource “。

    GL extension strings generally look something 这样地: GL_EXT_framebuffer_blit

    glShaderSourceARB 增加了 ARB_shader_objects 但自从OpenGL2.0以来一直是核心功能。

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