EGLImage与纹理

EGLImage代表一种由EGL客户API(如OpenGL,OpenVG)创建的共享资源类型。它的本意是共享2D图像数据,但是并没有明确限定共享数据的格式以及共享的目的,所以理论上来讲,应用程序以及相关的客户API可以基于任意的目的创建任意类型的共享数据。

 

         关于EGLImage的一种使用情景就是通过它来创建一个2D纹理。相关函数原型声明如下:

EGLAPI EGLImageKHR EGLAPIENTRYeglCreateImageKHR (EGLDisplay dpy, EGLContext ctx, EGLenum target,EGLClientBuffer buffer, const EGLint *attrib_list);

这里我们主要关注下target,buffer参数。target决定了创建EGLImage的方式,例如在Android系统中专门定义了一个称为EGL_NATIVE_BUFFER_ANDROID的Target,支持通过ANativeWindowBuffer创建EGLImage对象,而Buffer则对应创建EGLImage对象时使用数据。

 

使用方式如下:

假设我们通过Gralloc模块创建了一个ANativeWindowBuffer对象srcBuf,它将被当作EGLClientBuffer类型的参数传递给上述函数,调用形式如下:

EGLImageKHR eglSrcImage =eglCreateImageKHR(eglDisplay, EGL_NO_CONTEXT,

                                                                                    EGL_NATIVE_BUFFER_ANDROID,

                                                                                    (EGLClientBuffer)&sSrcBuffer,0);

创建了一个EGLImage对象后,我们可以通过它创建一个2D纹理对象,示例如下:

         glGenTextures(1,&texID);

         …

 

         glBindTexture(GL_TEXTURE_2D,texID);

    …

 

         glEGLImageTargetTexture2DOES(GL_TEXTURE_2D,eglSrcImage);//相当于一般情况下的glTexImage2D的效果

 

如果EGLClientBuffer的数据是YUV格式的,还可以使用纹理Target为:GL_TEXTURE_EXTERNAL_OES, 该Target也是主要用于从EGLImage中产生纹理的情景,并且它与GL_TEXTURE_2D不同,它只能用于此种情景,也就是说gl*Tex*Image*( GL_TEXTURE_EXTERNAL_OES,…)是非法的。

    这种创建纹理的方式使得显示一些OpenGL ES本身并不支持的图像格式的数据成为可能,因为它将格式支持相关的工作移到到了EGLImage创建函数当中。

 

你可能感兴趣的:(OpenGL)