GL_TEXTURE_2D and GL_TEXTURE_EXTERNAL_OES的使用场景
时间: 2023-07-22 07:56:17 浏览: 80
GL_TEXTURE_2D是OpenGL ES中最常用的2D纹理目标类型,用于渲染2D图像。它可以用于存储和渲染普通2D图像,例如JPEG、PNG等格式的图片,也可以用于存储和渲染视频帧。
GL_TEXTURE_EXTERNAL_OES是OpenGL ES扩展中的一种纹理目标类型,用于渲染由外部OES(EGL_IMAGE_EXTERNAL_OES)纹理产生的图像。它主要用于Android系统中的OpenMAX组件中,如硬件解码器和相机预览等,因为这些组件产生的纹理是OES类型的。
在Android系统中,通常使用GL_TEXTURE_EXTERNAL_OES纹理目标来渲染相机预览帧和视频帧,因为相机预览和视频帧通常以OES类型的纹理形式出现。而对于普通的2D图像,通常使用GL_TEXTURE_2D纹理目标来渲染。因此,在OpenGL ES中,选择使用GL_TEXTURE_2D还是GL_TEXTURE_EXTERNAL_OES纹理目标,取决于所要渲染的图像类型。
相关问题
GL_TEXTURE_EXTERNAL_OES 和 GLES20.GL_TEXTURE_2D
GL_TEXTURE_EXTERNAL_OES 和 GLES20.GL_TEXTURE_2D 都是 OpenGL ES 中的纹理类型,但是它们的使用场景和功能有所差别。
GL_TEXTURE_EXTERNAL_OES 用于外部纹理,比如摄像头采集的数据或者视频解码后的数据。它与 GLES20.GL_TEXTURE_2D 不同的地方在于,它的纹理坐标是通过一个矩阵来计算的,而不是直接使用二维坐标,这个矩阵可以通过 OpenGL ES 扩展函数来设置和更新。
GLES20.GL_TEXTURE_2D 则是普通的二维纹理,用于绘制 2D 图形或者贴图。它的纹理坐标直接使用二维坐标即可,不需要额外的矩阵计算。
因此,在使用 OpenGL ES 进行图形或者视频处理时,需要根据具体的场景和需求选择不同的纹理类型。
抓取 GL_TEXTURE_EXTERNAL_OES 纹理图像
GL_TEXTURE_EXTERNAL_OES是OpenGL ES中用于外部纹理的一种纹理类型。它通常用于显示来自外部硬件设备(如相机)的视频流或其他外部数据源的图像。因为它是外部纹理,所以不能直接使用glTexImage2D等函数加载纹理图像,需要通过其他方式获取它的图像数据。
一种常见的方式是使用Android中的SurfaceTexture类,它可以将外部纹理映射到纹理对象上,并提供对纹理对象的访问。在OpenGL ES中,可以通过glGenTextures生成纹理对象,然后将SurfaceTexture的纹理ID绑定到该对象上,即可获取外部纹理图像。
以下是一些示例代码,展示如何使用SurfaceTexture和纹理对象抓取外部纹理图像:
```java
// 创建一个SurfaceTexture对象,指定外部纹理ID
SurfaceTexture surfaceTexture = new SurfaceTexture(externalTextureId);
// 获取SurfaceTexture所对应的Surface对象
Surface surface = new Surface(surfaceTexture);
// 创建一个EGLDisplay、EGLSurface和EGLContext
// 然后将EGLSurface绑定到Surface上
// 获取外部纹理图像的宽度和高度
int width = 0, height = 0;
GLES20.glBindTexture(GLES11Ext.GL_TEXTURE_EXTERNAL_OES, externalTextureId);
GLES20.glGetTexLevelParameteriv(GLES11Ext.GL_TEXTURE_EXTERNAL_OES, 0, GLES20.GL_TEXTURE_WIDTH, mTexWidth, 0);
GLES20.glGetTexLevelParameteriv(GLES11Ext.GL_TEXTURE_EXTERNAL_OES, 0, GLES20.GL_TEXTURE_HEIGHT, mTexHeight, 0);
// 创建一个2D纹理对象
int[] textures = new int[1];
GLES20.glGenTextures(1, textures, 0);
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, textures[0]);
// 将SurfaceTexture的纹理ID绑定到纹理对象上
GLES20.glTexImage2D(GLES20.GL_TEXTURE_2D, 0, GLES20.GL_RGBA, width, height, 0, GLES20.GL_RGBA, GLES20.GL_UNSIGNED_BYTE, null);
surfaceTexture.updateTexImage();
// 解绑纹理对象和EGLSurface、EGLContext等
```
这里的externalTextureId是外部纹理的ID,可以通过其他方式获取。注意,在使用SurfaceTexture时,需要使用正确的纹理类型(GLES11Ext.GL_TEXTURE_EXTERNAL_OES),并且需要在更新纹理图像之前调用surfaceTexture.updateTexImage()函数来更新纹理数据。