Java 如何在Fatter for Android中呈现OpenGL?

Java 如何在Fatter for Android中呈现OpenGL?,java,android,flutter,opengl-es,Java,Android,Flutter,Opengl Es,这是我的java方法调用,它创建了我的SurfaceTexture,并将其保存到我的类实例中。我一直在阅读有关SurfaceTexture的课程,以下是我对它的理解: 我需要调用surfaceTexture.setOnFrameAvailableListener(surfaceTexture.OnFrameAvailableListener侦听器)来传递定义函数onFrameAvailable(surfaceTexture-surfaceTexture)的实例。如果我理解正确,该函数由updat

这是我的java方法调用,它创建了我的
SurfaceTexture
,并将其保存到我的类实例中。我一直在阅读有关SurfaceTexture的课程,以下是我对它的理解:

我需要调用
surfaceTexture.setOnFrameAvailableListener(surfaceTexture.OnFrameAvailableListener侦听器)
来传递定义函数
onFrameAvailable(surfaceTexture-surfaceTexture)
实例。如果我理解正确,该函数由
updateMaximage()
调用。所以我认为
onFrameAvailable
应该抓取图像并渲染它?如果是这样的话,我如何在其中调用OpenGL函数?OpenGL上下文在哪里

我完全不知道如何渲染它。我发现的所有Android OpenGL示例都使用曲面视图或类似的东西。我需要知道如何创建一个纯opengl上下文

我还认为,当调用onFrameAvailable时,surfaceTexture的纹理绑定到OpenGL上下文,因此我不需要创建着色器、调整纹理参数等。我只需要对其进行渲染,可能需要调用
glTexImage2D

那么,如何使用flatter提供给我的这个SurfaceTexture,用
glTexImage2D
渲染像红方块这样简单的东西呢?

更新:

我发现:

我成功地用

if (call.method.equals("createVideoRenderer")) {
            TextureRegistry.SurfaceTextureEntry entry = textures.createSurfaceTexture();
            SurfaceTexture surfaceTexture = entry.surfaceTexture();
            this.surfaceTexture = surfaceTexture;
但是,我想使用
glTeximage2D
。我试着简单地加上

GLES20.glClearColor(0f, green, 0f, 1f);

GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT | GLES20.GL_DEPTH_BUFFER_BIT);
但它不起作用

更新:

我做了一些研究,发现(我认为)android使用gl外部纹理,所以我尝试:

GLES20.glTexImage2D(GLES20.GL_TEXTURE_2D, 0, GLES20.GL_RGBA, 100, 100,
                0, GLES20.GL_RGBA, GLES20.GL_UNSIGNED_BYTE, buffer);
buffer=ByteBuffer.allocate(bufferSize);
对于(int i=0;i
我应该看到一个红色的图像,但我什么也没看到


我还尝试在
glTexImage2D
中使用
GLES20.RGBA8
,但没有成功。我还尝试了
GLES11Ext.glEGLImageTargetTexture2DOES(GL_TEXTURE_EXTERNAL_OES,buffer)
来代替
glTexImage2D
,但它也不起作用。

纹理在Android仿真器和设备上运行良好,但仅在iOS设备上运行,而不是在iOS仿真器上运行

嘿,我找到了一些有用的链接,我想这可以解决你的问题


查看:

非常感谢,但这是我从中选择我使用的示例的链接
    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);