GL_TEXTURE_EXTERNAL_OES 和 GLES20.GL_TEXTURE_2D
时间: 2023-07-21 10:46:36 浏览: 70
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()函数来更新纹理数据。
java 获取 GL_TEXTURE_EXTERNAL_OES纹理bitmap
以下是一个在 Java 中获取 GL_TEXTURE_EXTERNAL_OES 纹理的 Bitmap 的示例代码:
```java
// 创建一个 SurfaceTexture 对象
SurfaceTexture surfaceTexture = new SurfaceTexture(textureId);
// 创建一个 Surface 对象,并将 SurfaceTexture 绑定到这个 Surface 上
Surface surface = new Surface(surfaceTexture);
// 创建一个 EGLDisplay 和 EGLContext
EGLDisplay eglDisplay = EGL14.eglGetDisplay(EGL14.EGL_DEFAULT_DISPLAY);
EGLContext eglContext = EGL14.eglGetCurrentContext();
// 创建一个 EGLSurface 并将 Surface 绑定到这个 EGLSurface 上
EGLSurface eglSurface = EGL14.eglCreateWindowSurface(eglDisplay, eglConfig, surface, null);
// 将 EGLContext 和 EGLSurface 绑定到当前线程中
EGL14.eglMakeCurrent(eglDisplay, eglSurface, eglSurface, eglContext);
// 创建一个 Bitmap 对象,并设置宽度和高度
Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
// 读取 GL_TEXTURE_EXTERNAL_OES 纹理的像素数据到 Bitmap 中
GLES20.glReadPixels(0, 0, width, height, GLES20.GL_RGBA, GLES20.GL_UNSIGNED_BYTE, bitmap);
// 释放 EGLSurface 和 Surface 对象
EGL14.eglDestroySurface(eglDisplay, eglSurface);
surface.release();
// 将 Bitmap 对象返回
return bitmap;
```
需要注意的是,这段代码需要在 OpenGL ES 的上下文中执行,通常是在一个 GLSurfaceView 或 TextureView 中。同时,GL_TEXTURE_EXTERNAL_OES 纹理是与 Android 相机相关的纹理类型,需要在相机预览的回调函数中获取该纹理的 ID。