手机硬件更新如此之快,以至于我们开始进入一个手机与高端PC无异的时代。它们的区别只是芯片的功耗。我不想听起来像是在推销我们自己的芯片,但我相信TegraK1是未来产品的预演。这不仅仅发生在我们身上,我希望其他行业也能加入进来,这样开发人员就可以安全地假设从PC到移动设备的功能集相对统一。K1就是最好的例子,因为它的GPU核心是Kepler。这不是什么营销噱头,它实际上是运行GTX780等惊人功能的相同微架构。多年的鲜血、汗水和泪水使之成为可能。并且受尺寸、功率和热限制的限制,它只有192个内核(而不是2304个),但它在性能上仍然具有相当的竞争力。更重要的是,它在功能上是完全不同的阵营,因为它支持完整的桌面级OpenGL4.4,包括几何着色器、曲面细分、计算等,还有像bindless这样的扩展支持其他东西。但是Android只支持OpenGLES,对吧?其实并不是。虽然现在在Android平台上,唯一官方支持的图形API是OpenGLES,但您仍然可以使用EGL在平台上创建一个“大”的OpenGL上下文,前提是您的设备支持它。这使得在不同操作系统上传输数据变得切实可行。Windows/Linux/Mac/streamOS都有OpenGL后台程序,可以快速启动和模拟clipplanes、alpha测试或规范中的一些差异。它还可以作为渲染后端的一个很好的参考,在ES渲染路径启动并运行之前验证您的端口。别担心,您可以在您的应用程序中同时使用GLES和BigGL。其实很简单。最重要的是EGL,它是Android公开的用于创建OpenGL上下文的API。Java或C/C++也可以做到,但需要注意EGL_SPEC.1.4或以上版本。首先,在创建上下文(或调用任何EGL函数)之前,了解哪个版本的GL最支持当前设备。这可以通过简单地调用eglBindAPI(EGL_OPENGL_API)来完成。此API会将EGL切换到桌面OpenGL模式,如果当前设备不支持则返回EGL_TRUE或保持状态不变并返回EGL_FALSE。由于此函数切换全局状态,因此让EGL先调用它而不是稍后调用它是最安全的。创建上下文后,如果eglBindAPI()函数没有切换BigGL模式,您需要像之前一样创建您的ES上下文。如果切换成功,您可以选择创建一个BigGL上下文。幸运的是,EGL使它变得简单。因为我们已经调用了eglBindAPI(EGL_OPENGL_API),EGL已经设置为BigGL模式,所以我们只需要在配置文件和context中调整一些属性即可。首先,在传递给eglChooseConfig()的配置属性中,我们需要确保EGL_RENDERABLE_TYPE设置为EGL_OPENGL_BIT,而不是EGL_OPENGL_ES2_BIT。其次,传递给函数eglCreateContext()的属性也需要稍微调整一下。对于ES上下文,通常将EGL_CONTEXT_CLIENT_VERSION设置为1、2或3,具体取决于您要构建的OpenGLES版本。对于BigGL上下文,我们不使用这个属性,所以不要设置它。事实上,您只需将BigGL属性列表留空即可。粗略地说,这看起来像以下示例(为简洁而忽略错误检查):if(eglBindAPI(EGL_OPENGL_API)){//CreateaBigGLcontext...EGLDisplaydisplay=eglGetDisplay(...);eglInitialize(display,...);constEGLintconfigAttrs[]={EGL_SURFACE_TYPE,EGL_WINDOW_BIT,EGL_RENDERABLE_TYPE,EGL_OPENGL_BIT,//此处的后台缓冲区属性...EGL_NONE};EGLConfigconfig;EGLintnumConfigs=0;eglChooseConfig(display,configAttrs,&configsNEEGL_BIT,&numConfigs=AttrsEXT);eglCreateContext(display,NO_config,EGL,_ctxAttrs);}else{//TODO:FallbacktooldEScontextcreation...}***一个小问题,也是我对使用OpenGL或OpenGLES的开发者的建议,无论他们基于什么平台进行开发。如上所述,在API之间切换尤为重要。而且,不要隐式链接到GL符号!要获得更多功能,您应该使用eglGetProcAddress(),并注意不要跨上下文共享函数指针。如果你做了一些疯狂的事情,比如在同一个应用程序中创建一个BigGL上下文和一个ES上下文,或者创建像glDrawElement()这样存在于两个API中的函数,但可能指向完全不同的实现方法。这意味着您应该只链接到libEGL,因此您需要使用qglGetProcAddress()函数查询所有符号。编辑:应该指出的是,从技术角度来看,通过eglGetProcAddress()提供的“EGL_KHR_get_all_proc_addresses”应该是当前的核心功能,但我坚信,由于它目前是在Android通用EGL接口上实现的,这意味着它可以单独驱动,这在旧版本的Android上可能无法正常工作。但是,如果您正在考虑BigGL支持,您可能不希望旧设备成为您前进道路上的绊脚石。特别强调:我强烈建议任何正在开发的应用程序如果可能的话也应该有一个GLES渲染路径。BigGL对于开发很有用,对于一些边缘功能甚至更有用,但是拥有GLES后端也将帮助Android避免碎片化,并帮助您的应用程序获得尽可能多的用户曝光。英文原文:OpenGL4.4andbeyondonAndroid翻译链接:http://www.oschina.net/translate/opengl-44-and-beyond-on-android
