要实现3D引擎的跨平台功能. 必须研究OpenGLES的接口规范. 而OpenGLES 在IOS平台上的使用也有自身的特点.本文将详细比较两者在使用上的异同.
一. OpenGL ES对象及接口函数
OpenGL ES中的对象分别用于处理两大类问题: 平台相关的问题和OpenGL渲染相关的问题.
EGLDisplay与EGLSurface用于处理与平台相关的问题.
EGLContext处理与OpenGL渲染相关的问题.
1. EGLDisplay可以简单理解为一个显示渲染结果的渲染窗口. EGLSurface可以理解为此窗口中的显示表面.只有画在此surface上的内容,才是渲染窗口中最后显示出来的画面.
1) 一般的应用平台在使用OpenGLES对象时, 只要使用以下API即可:eglGetDisplay, eglInitialize, eglChooseConfig, eglCreateWindowSurface 等.
2) 但在Apple平台中, 对OpenGLES的使用略有不同.
在IOS编程中必须要有一个UIWindow类实例对象,UIWindow就相当于上面的EGLDisplay.同时还必须要有一个从UIView类派生的类(可以称之为CustomView),UIView就相当于上面的EGLSurface. 并且必须将CustomView的成员变量layer, 由CALayer类型变为CAEAGLLayer类型. CAEAGLLayer成员的作用, 类似于eglChooseConfig函数. 用来设置目标surface的宽,高,像素格式及透明性等属性.设置完CAEAGLLayer后, 再以此对象的设置为参数, 调用renderbufferStorage来分配相应的内存空间(其作用类似于eglCreateWindowSurface?).
需要明确的是, 一个UIView的最终显示结果, 是由它所包含的所有layer的画面叠加后形成的.
2. EGLContext
与OpenGL渲染相关的内容由EGLContext对象来管理. 首先要调用eglCreateContext函数创建一个EGLContext对象,EGLContext内部采用双缓冲机制来实现渲染结果的显示.EGLContext有两个Framebuffer对象.一个做为back一个为front.当渲染完一帧后.通过调用eglSwapBuffers函数, EGLContext会自动交换两个Framebuffer的位置, 并且将front Framebuffer中的内容提交给相应的EGLSurface.在一个进程中,可以同时创建多个EGLContext对象(eglCreateContext),但当前context只能有一个, 需要通过eglMakeCurrent来设定.
在App