Simple DirectMedia Layer 的 SDL_GL_GetProcAddress 是否与用于嵌入式系统的 OpenGL ES 2.0 一起工作

Is Simple DirectMedia Layer's SDL_GL_GetProcAddress working with OpenGL ES 2.0 for embedded systems

我正在为 Android 使用 OpenGL ES 2.0 和 SDL2 构建应用程序。 SDL_GL_GetProcAddress 是否在 Android 上使用 OpenGL ES 2.0?另外我知道 OpenGL ES 2.0 是 OpenGL 的一个子集,所以使用这种方法也可以在桌面系统上 运行 吗?

通过快速浏览 SDL 存储库,它应该是。

SDL_video.c 定义 SDL_GL_GetProcAddress 的实现只是为了检查您是否启动了 OpenGL 然后调用 _this->GL_GetProcAddress,其中 _this 是视频驱动程序。

SDL_androidvideo.c 将其 GL_GetProcAddress 设置为 Android_GLES_GetProcAddress,这是 SDL_EGL_GetProcAddress.

的预处理器替代

到目前为止:如果您拨打 SDL_GL_GetProcAddress,您将接通 SDL_EGL_GetProcAddress

SDL_egl.c 实现 SDL_EGL_GetProcAddress 但拒绝在 Android 上调用 eglGetProcAddress。这看起来可能是一个错误 — 给出的原因是 this bug 但该错误的状态在 2013 年 6 月切换为 'Released',我相信这意味着此问题已在 Android 中修复三年多了。

除此之外,后备方法是使用 SDL_LoadFunction,首先使用直接函数名称,然后在它后面加上一个下划线,前提是它足够短以适合静态声明的缓冲区。这是哪个。

(所以,警告:SDL_GL_GetProcAddress 绝对不是线程安全的,即使您采取了适当的共享组步骤来使用多个 GL 上下文,但如果您正在编写 SDL 程序,您可能不会没关系)

Android 应该使用 SDL_sysloadso 的 dlopen 版本,所以看起来 SDL_LoadFunction 是直接调用 dlsym 实现的。在 Android.

下我没有发现任何问题

因此,总而言之:是的,该调用应该有效。它将使用特定于平台的动态库加载器而不是 EGL 调用,尽管它可能不需要,但这只是一个实现细节。