我必须将字节数组图像绘制到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绘制图像直接字节数组。
答案 0 :(得分: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);
完成此步骤后,只需绘制纹理
答案 1 :(得分:0)
我通过GLES20.GlRgb565到GLES20.GlRgba的更改格式找到了解决方案。
GLES20.GlRGB565和GLES20.GlRGBA4不是传递给glTexImage2D的GLES20.GlTexImage2D()的有效值。