如何在 Flutter for Android 中渲染 OpenGL?

2022-09-02 22:44:19
if (call.method.equals("createVideoRenderer")) {
            TextureRegistry.SurfaceTextureEntry entry = textures.createSurfaceTexture();
            SurfaceTexture surfaceTexture = entry.surfaceTexture();
            this.surfaceTexture = surfaceTexture;

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

我需要调用以传递定义函数的实例。如果我理解正确,此函数由 调用。所以我认为应该抓住图像并渲染它吗?如果是这样,我如何在其中调用OpenGL函数?OpenGL 上下文在哪里?surfaceTexture.setOnFrameAvailableListener(SurfaceTexture.OnFrameAvailableListener listener)SurfaceTexture.OnFrameAvailableListeneronFrameAvailable(SurfaceTexture surfaceTexture)updateTexImage()onFrameAvailable

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

我还认为,当调用 onFrameAvailable 时,surfaceTexture 的纹理绑定到 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.RGBA8glTexImage2DGLES11Ext.glEGLImageTargetTexture2DOES( GL_TEXTURE_EXTERNAL_OES, buffer )glTexImage2D


答案 1

纹理在Android模拟器和设备上运行良好,但仅在iOS设备上有效,而不是iOS模拟器。

嘿,我为你找到了一些有用的链接,我认为这解决了你的问题

查看 : OpenGL with Texture widget


答案 2

推荐