Как визуализировать OpenGL в Flutter для Android? - PullRequest
6 голосов
/ 24 октября 2019
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, которые я нахожу, используют виды поверхности или что-то в этом роде. Мне нужно знать, как создать чистый контекст opengl.

Я также думаю, что когда вызывается onFrameAvailable, текстура surfaceTexture привязывается к контексту OpenGL, поэтому мне не нужно создавать шейдеры, настраивать параметры текстуры и т. Д. Мне просто нужно рендериться, возможно,Вызов glTexImage2D.

Итак, как сделать что-то столь же простое, как красный квадрат с glTexImage2D, используя эту SurfaceTexture, которую мне дает Флаттер?

ОБНОВЛЕНИЕ:

Я нашел это: 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, и это также не сработало.

1 Ответ

0 голосов
/ 30 октября 2019

Текстура хорошо работает на эмуляторе Android и устройствах, но только на устройстве iOS, а не на iOS Simulator.

эй, я нашел несколько полезных ссылок для вас, я думаю, что это решит вашу проблему

проверить: OpenGL с виджетом текстуры

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...