0

我必须将字节数组图像绘制到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 为直接字节数组绘制图像。

4

2 回答 2

0

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

GLES20.GlRGB565 和 GLES20.GlRGBA4 不是传递给从glTexImage2D中找到的 GLES20.GlTexImage2D() 的有效值。

于 2017-02-01T06:23:50.340 回答
0

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);

在此步骤之后,只需绘制您的纹理

于 2017-01-25T14:17:48.897 回答