【发布时间】:2020-02-20 05:20:37
【问题描述】:
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) 来传递定义函数onFrameAvailable(SurfaceTexture surfaceTexture) 的SurfaceTexture.OnFrameAvailableListener 实例。如果我理解正确的话,这个函数是由updateTexImage() 调用的。所以我认为onFrameAvailable 应该抓取图像并渲染它?如果是这样,我如何在其中调用 OpenGL 函数? OpenGL 上下文在哪里?
我完全不知道如何渲染它。我发现的所有 Android OpenGL 示例都使用表面视图或类似的东西。我需要知道如何创建一个纯 opengl 上下文。
我也觉得在调用onFrameAvailable的时候,surfaceTexture的纹理是绑定到OpenGL上下文的,所以我不需要创建shader,调纹理参数等等,我只需要渲染到它,或许调用@987654329 @。
那么如何使用 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);
我应该看到一个红色的图像,但我什么也没看到。
我也尝试在glTexImage2D 中使用GLES20.RGBA8,但没有成功。我还尝试用GLES11Ext.glEGLImageTargetTexture2DOES( GL_TEXTURE_EXTERNAL_OES, buffer ) 代替glTexImage2D,但也没有用。
【问题讨论】:
标签: java android flutter opengl-es