我在Debian stable上使用SDL2 2.0.2,我正在尝试用它获取OpenGL ES 3.0上下文。如果我请求OpenGL ES 2.0上下文,这是有效的,但如果我直接请求OpenGL ES 3.0上下文则不行。
考虑以下计划:
#include <GLES3/gl3.h>
#include <SDL2/SDL.h>
int main(
int argc,
char **argv
) {
SDL_GLContext context;
int rc;
const GLubyte *version;
SDL_Window *window;
rc = SDL_Init(SDL_INIT_VIDEO);
if (rc < 0) {
return EXIT_FAILURE;
}
atexit(SDL_Quit);
SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_ES);
#ifdef THIS_SHOULD_WORK_TOO
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3);
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 0);
#else
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 2);
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 0);
#endif
window = SDL_CreateWindow("OpenGL", 100, 100, 800, 600, SDL_WINDOW_OPENGL);
context = SDL_GL_CreateContext(window);
version = glGetString(GL_VERSION);
if (version == 0) {
printf(
"Unable to get OpenGL ES version string: %d\n",
glGetError()
);
return EXIT_FAILURE;
}
printf("Version string: %s\n", version);
SDL_GL_DeleteContext(context);
return EXIT_SUCCESS;
}
当我正常编译时,它会请求一个OpenGL ES 2.0上下文,程序会收到一个OpenGL ES 3.0上下文:
$ c99 example.c -lSDL2 -lGLESv2
$ ./a.out
Version string: OpenGL ES 3.0 Mesa 10.3.2
但是,当我请求OpenGL ES 3.0上下文时,此程序在没有明确错误消息的情况下失败:
$ c99 -DTHIS_SHOULD_WORK_TOO example.c -lSDL2 -lGLESv2
$ ./a.out
Unable to get OpenGL ES version string: 0
为什么会这样?
我怀疑这是因为-lGLESv2
,主要是因为OpenGL ES上下文报告它是版本3.0,并且因为发送libGLESv3.so
的平台将它作为符号链接发送到{{1}例如,(promised)。
答案 0 :(得分:5)
SDL的EGL代码(用于在Windows / Linux / Android /等上创建OpenGL ES上下文)似乎只能正确支持OpenGL ES 1和2上下文。
特别是,如果请求GLES2,则当前代码将EGL_RENDERABLE_TYPE配置属性设置为EGL_OPENGL_ES2_BIT,而在所有其他情况下,将EGL_OPENGL_ES_BIT设置为EGL_OPENGL_ES_BIT。即使请求GLES3.0 +,它也永远不会使用EGL_OPENGL_ES3_BIT / EGL_OPENGL_ES3_BIT_KHR。当请求3.1时,它也不使用EGL_CONTEXT_MINOR_VERSION_KHR将版本设置为3.1而不是SDL_EGL_CreateContext中的3.0。
这意味着对OpenGL ES 3.0的请求被转换为对OpenGL ES 1.0的请求。由于OpenGL ES 3.0向后与OpenGL ES 1.0不兼容,因此请求最终失败(我认为)。
The fix已合并到主分支中,并计划发布as part of SDL2 version 2.0.4:
- 添加了EGL_KHR_create_context支持以允许在某些平台上选择OpenGL ES版本