【问题标题】:How to render OpenGL in Flutter for Android?如何在 Flutter for Android 中渲染 OpenGL?
【发布时间】: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


    【解决方案1】:

    Texture 在 Android 模拟器和设备上运行良好,但仅适用于 iOS 设备,不适用于 iOS 模拟器。

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

    签出:OpenGL with Texture widget

    【讨论】:

    • 非常感谢,但这是我选择我使用的示例的链接
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-11
    • 2015-07-08
    • 2020-11-07
    • 1970-01-01
    相关资源
    最近更新 更多