字节数组图像显示到 glsurafceview 使用 GLES20.GlTexImage2D() android xamarin

byte array image show to glsurafceview using GLES20.GlTexImage2D() android xamarin

我必须将字节数组图像绘制到 glsurfaceview,它不断来自 xamarin android 项目中的服务器。代码不适用于直接缓冲区绘制,但适用于位图绘制。

如果我将字节数组转换为位图并绘制,我的代码就可以工作了:

mBitmap = { .. create bitmap from byte[].. }
GLUtils.TexImage2D(GLES20.GlTexture2d, 0, mBitmap, 0);

在相同的代码中,如果我输入以下代码,则不会绘制。我想使用 GLES20.GlTexImage2D() 绘制字节数组。我的无效代码是:

// mFrameBuffer is my byte array
ByteBuffer buffer = ByteBuffer.AllocateDirect(mFrameBuffer.Length);
buffer.Order (ByteOrder.NativeOrder());
buffer.Put (mFrameBuffer);
buffer.Position (0);
GLES20.GlTexImage2D (GLES20.GlTexture2d, 0, GLES20.GlRgb565, mWidth, mHeight, 0, GLES20.GlRgb565, GLES20.GlUnsignedByte, buffer);

如何使用 GlTexImage2D 为直接字节数组绘制图像。

buffer.position(0) 之后你应该在一些插槽上绑定一些纹理

int id = -1;
GLES20.glActiveTexture(GLES20.GL_TEXTURE0);
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, id);

在此之后检查您的位图配置,如果它不是 RGB565,您应该在 glTexImage2D 中使用相应的颜色格式,例如 GLES20.GL_RGBA 如果位图配置是 Bitmap.Config.ARGB_8888

GLES20.glTexImage2D(GL20W.GL_TEXTURE_2D, 0, GL20W.GL_RGBA, mWidth, mHeigh, 0,
            GL20W.GL_RGBA, GL20W.GL_UNSIGNED_BYTE, buffer)

然后将您的屏幕设置为 FrameBuffer 目标:

GLES20.glBindFramebuffer(GL_FRAMEBUFFER, 0);

在这一步之后简单地绘制你的纹理

我通过将格式从 GLES20.GlRgb565 更改为 GLES20.GlRgba 找到了解决方案。

GLES20.GlRGB565 和 GLES20.GlRGBA4 不是传递给从 glTexImage2D.

中找到的 GLES20.GlTexImage2D() 的有效值