if (call.method.equals("createVideoRenderer")) {
TextureRegistry.SurfaceTextureEntry entry = textures.createSurfaceTexture();
SurfaceTexture surfaceTexture = entry.surfaceTexture();
this.surfaceTexture = surfaceTexture;
这是我的java方法调用,它创建了
SurfaceTexture
并将其保存到我的类实例中。我一直在阅读有关SurfaceTexture的类,这是我的理解方式:我需要调用
surfaceTexture.setOnFrameAvailableListener(SurfaceTexture.OnFrameAvailableListener listener)
来传递SurfaceTexture.OnFrameAvailableListener
实例,该实例定义了函数onFrameAvailable(SurfaceTexture surfaceTexture)
。如果我正确理解,此函数将由updateTexImage()
调用。所以我认为onFrameAvailable
应该可以抓取图像并进行渲染?如果是这样,如何在其中调用OpenGL函数? OpenGL上下文在哪里?我完全不知道如何渲染它。我发现的所有Android OpenGL示例都使用曲面 View 或类似的 View 。我需要知道如何创建一个纯opengl上下文。
我还认为,当调用onFrameAvailable时,surfaceTexture的纹理将绑定(bind)到OpenGL上下文,因此我不需要创建着色器,调整纹理参数等。我只需要对其渲染,也许调用
glTexImage2D
即可。那么,如何使用Flutter给我的SurfaceTexture用
glTexImage2D
渲染像红场一样简单的东西呢? 更新:
我发现了这个:https://github.com/mogol/opengl_texture_widget_example
我成功地通过使用
GLES20.glClearColor(0f, green, 0f, 1f);
GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT | GLES20.GL_DEPTH_BUFFER_BIT);
但是,我想使用
glTeximage2D
。我尝试简单地添加GLES20.glTexImage2D(GLES20.GL_TEXTURE_2D, 0, GLES20.GL_RGBA, 100, 100,
0, GLES20.GL_RGBA, GLES20.GL_UNSIGNED_BYTE, buffer);
但这没用
更新:
我进行了一些研究,发现(我认为)android使用gl外部纹理,因此我尝试:
buffer = ByteBuffer.allocate(bufferSize);
for (int i = 0; i < bufferSize; i = i+=4) {
buffer.put((byte)255);
}
for (int i = 1; i < bufferSize-1; i = i+=4) {
buffer.put((byte)0);
}
for (int i = 2; i < bufferSize-2; i = i+=4) {
buffer.put((byte)0);
}
for (int i = 3; i < bufferSize-3; i = i+4) {
buffer.put((byte)255);
}
buffer.rewind();
GLES20.glTexParameteri(GLES11Ext.GL_TEXTURE_EXTERNAL_OES, GLES20.GL_TEXTURE_WRAP_S, GLES20.GL_CLAMP_TO_EDGE);
GLES20.glTexParameteri(GLES11Ext.GL_TEXTURE_EXTERNAL_OES, GLES20.GL_TEXTURE_WRAP_T, GLES20.GL_CLAMP_TO_EDGE);
GLES20.glTexParameteri(GLES11Ext.GL_TEXTURE_EXTERNAL_OES, GLES20.GL_TEXTURE_MIN_FILTER, GLES20.GL_LINEAR);
GLES20.glTexParameteri(GLES11Ext.GL_TEXTURE_EXTERNAL_OES, GLES20.GL_TEXTURE_MAG_FILTER, GLES20.GL_LINEAR);
GLES20.glTexImage2D(GLES11Ext.GL_TEXTURE_EXTERNAL_OES, 0, GLES11Ext.GL_RGB8_OES, 100, 100, 0, GLES11Ext.GL_RGB8_OES, GLES20.GL_UNSIGNED_BYTE, buffer);
我应该看到红色图像,但什么也看不到。
我也尝试在
GLES20.RGBA8
中使用glTexImage2D
,但没有用。我也尝试用GLES11Ext.glEGLImageTargetTexture2DOES( GL_TEXTURE_EXTERNAL_OES, buffer )
代替glTexImage2D
,但它也没有用。 最佳答案
纹理在Android模拟器和设备上运行良好,但仅在iOS设备上,而不在iOS模拟器上运行。
嘿,我为您找到了一些有用的链接,我认为这可以解决您的问题
checkout :OpenGL with Texture widget