是简单的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一起工作
从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调用,尽管它可能不需要,但这只是一个实现细节。
ES有一些不兼容的更改(如'glClearDepthf'而不是'glClearDepth',或者着色器中需要的精度说明符)。要在没有修改的桌面上运行它,您的驱动程序需要支持'ARB_ES2_compatibility'扩展(几乎每个现代驱动程序都这样做)。 – keltar