c - 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 表示这些扩展都受支持。我做错了什么?
解决方案
没有名为“ glShaderSource
”的扩展名。
GL 扩展字符串通常如下所示:GL_EXT_framebuffer_blit
glShaderSourceARB
由 OpenGL 2.0添加,ARB_shader_objects
但一直是核心功能。
除非您的目标是 2.0 之前的 GL 实现并且实际上计划支持 ARB 入口点,否则我建议您改为进行 GL 版本检查。
推荐阅读
- java - Android Studio Java JSON 获取数据问题
- java - Java 应用程序无法处理每周四晚上传入的特殊文件,而 Cassandra 抛出错误
- mysql - 我在 Mysql 中同时处理购买的方式是否正确?
- r - R:在多列上转换变量
- python - firebase_admin.exceptions.InvalidArgumentError
- typescript - 我怎样才能让 Typescript 明白 undefined 在这里可能是一个有效值?
- postgresql - Postgres 查询在 Windows 上运行,但不在 Linux 上
- java - 无法将 element(transactionDate, xs:anyType) 类型的值类 net.sf.saxon.tinytree.TinyElementImpl 转换为类 java.util.Date
- python - 在具有多个分隔符的 spark 数据框中拆分字符串
- python - 存储在列表中的矩阵的乘法