是简单的DirectMedia层的SDL_GL_GetProcAddress与嵌入式系统的OpenGL ES 2.0一起工作

问题描述:

我正在为Android构建一个带有OpenGL ES 2.0和SDL2的应用程序。 SDL_GL_GetProcAddress与Android上的OpenGL ES 2.0一起使用吗?另外我知道OpenGL ES 2.0是OpenGL的一个子集,所以这种方法可以在桌面系统上运行吗?是简单的DirectMedia层的SDL_GL_GetProcAddress与嵌入式系统的OpenGL ES 2.0一起工作

+1

ES有一些不兼容的更改(如'glClearDepthf'而不是'glClearDepth',或者着色器中需要的精度说明符)。要在没有修改的桌面上运行它,您的驱动程序需要支持'ARB_ES2_compatibility'扩展(几乎每个现代驱动程序都这样做)。 – keltar

从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 implements SDL_EGL_GetProcAddress但拒绝在Android上调用eglGetProcAddress。这看起来可能是一个错误 - 给出的原因是this bug,但该错误的状态在2013年6月转换为“已发布”,我相信这意味着Android已经在三年多的时间内修复了这一错误。

另外,回退是使用SDL_LoadFunction,首先使用直接函数名称,然后使用它进行下划线,只要它足够短以适合静态声明的缓冲区。这是哪一个。

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

Android应该使用SDL_sysloadso的dlopen版本,因此它看起来像SDL_LoadFunction直接作为dlsym的调用实现。我没有发现Android下的问题。

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