文章目录
本文首发地址 https://h89.cn/archives/140.html
最新更新地址 https://gitee.com/chenjim/chenjimblog
引言
在Android系统中,SurfaceTexture 是一个特殊的类,它将来自硬件纹理缓冲区(如相机预览流或视频解码输出)的图像数据转换为 OpenGL ES 可以直接使用的纹理。updateTexImage() 方法是 SurfaceTexture 类的核心方法之一,此方法的主要作用是从 SurfaceTexture 内部持有的图像缓冲区中取出最新一帧,并将其内容复制到与 SurfaceTexture 关联的 OpenGL 纹理上。这对于实时图形渲染、视频播放以及从相机捕获并实时处理图像等场景至关重要。
updateTexImage 简单使用
下面是一个简化的使用 SurfaceTexture 与 GLSurfaceView 实现渲染的基本流程:
// 初始化 SurfaceTexture
SurfaceTexture surfaceTexture = new SurfaceTexture(GLES11Ext.GL_TEXTURE_EXTERNAL_OES);
surfaceTexture.setOnFrameAvailableListener(new SurfaceTexture.OnFrameAvailableListener() {
@Override
public void onFrameAvailable(SurfaceTexture st) {
// 新帧到达时,通知主线程进行渲染
// 在这里可以调用 requestRender() 或者通过 Handler 发送消息
}
});
// 在GL线程中初始化纹理并绑定
fun initTexture(){
int[] textureId = new int[1];
GLES20.glGenTextures(1, textureId, 0);
GLES20 glBindTexture(GLES11Ext.GL_TEXTURE_EXTERNAL_OES, textureId[0]);
// 设置纹理参数
GLES20.glTexParameterf(GLES11Ext.GL_TEXTURE_EXTERNAL_OES,
GL10.GL_TEXTURE_MIN_FILTER, GL10.GL_LINEAR);
GLES20.glTexParameterf(GLES11Ext.GL_TEXTURE_EXTERNAL_OES,
GL10.GL_TEXTURE_MAG_FILTER, GL10.GL_LINEAR);
// 将SurfaceTexture关联到OpenGL纹理
surfaceTexture.attachToGLContext(textureId[0]);
}
// 在onDrawFrame(GL10 gl)方法中更新和渲染纹理
@Override
public void onDrawFrame(GL10 unused) {
// 检查是否有新帧可用
if (surfaceTexture.isFrameAvailable()) {
// 更新纹理数据
surfaceTexture.updateTexImage();
// 获取变换矩阵
float[] transformMatrix = new float[16];
surfaceTexture.getTransformMatrix(transformMatrix);
// 使用该矩阵进行纹理坐标变换后渲染
// ...
}
}
// 注意:实际应用中需要确保在正确的线程上调用 updateTexImage() 和其他OpenGL函数
SurfaceTexture 初始化相关源码分析
android.graphics.SurfaceTexture 初始化
// frameworks.base\graphics\java\android\graphics\SurfaceTexture.java
public SurfaceTexture(int texName, boolean singleBufferMode) {
mCreatorLooper = Looper.myLooper();
mIsSingleBuffered

最低0.47元/天 解锁文章
4133





