【问题标题】:byte array image show to glsurafceview using GLES20.GlTexImage2D() android xamarin使用 GLES20.GlTexImage2D() android xamarin 向 glsurafceview 显示字节数组图像
【发布时间】:2017-01-25 13:04:12
【问题描述】:

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

【问题讨论】:

    标签: android xamarin bytebuffer glsurfaceview glteximage2d


    【解决方案1】:

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

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

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

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

    在这一步之后,只需绘制你的纹理

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        猜你喜欢
        • 2017-09-30
        • 1970-01-01
        • 1970-01-01
        • 2012-03-16
        • 2023-03-31
        • 1970-01-01
        • 2017-05-13
        • 2017-01-13
        • 1970-01-01
        相关资源
        最近更新 更多