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