gpt4 book ai didi

java - 如何在 Android 版 Flutter 中渲染 OpenGL?

转载 作者:行者123 更新时间:2023-12-01 23:13:39 25 4
gpt4 key购买 nike

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 示例都使用表面 View 或类似的东西。我需要知道如何创建一个纯 opengl 上下文。

我还认为,当调用 onFrameAvailable 时,surfaceTexture 的纹理绑定(bind)到 OpenGL 上下文,因此我不需要创建着色器、调整纹理参数等。我只需要渲染它,也许调用 glTexImage2D.

那么如何使用 Flutter 提供的 SurfaceTexture 使用 glTexImage2D 渲染像红色方 block 这样简单的东西?

更新:

我发现了这个: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 ,但它也不起作用。

最佳答案

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

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

查看:OpenGL with Texture widget

关于java - 如何在 Android 版 Flutter 中渲染 OpenGL?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58531692/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com