【问题标题】:Android OpenGL ES 2.0 texture update shows blackAndroid OpenGL ES 2.0 纹理更新显示黑色
【发布时间】:2013-02-04 16:36:03
【问题描述】:

我正在尝试将 XML 布局呈现到 OpenGL 表面。这工作正常,我可以在布局上做 3D 效果。但是,当我尝试更新它并再次渲染它时,它不起作用。玩弄并尝试不同的功能,最终结果要么是黑色对象,表面外部小部件上的图形损坏,要么是未经任何修改的原始对象。

我将视图转换为位图的代码是:

public static Bitmap toBitmap(final View view) {
    final Bitmap bitmap = Bitmap.createBitmap(400, 100,
            Bitmap.Config.ARGB_8888);
    final Canvas canvas = new Canvas(bitmap);
    final Paint paint = new Paint();

    view.setDrawingCacheEnabled(true);

    final int width = MeasureSpec.makeMeasureSpec(canvas.getWidth(),
            MeasureSpec.EXACTLY);
    final int height = MeasureSpec.makeMeasureSpec(canvas.getHeight(),
            MeasureSpec.EXACTLY);
    view.measure(width, height);
    view.layout(0, 0, view.getMeasuredWidth(), view.getMeasuredHeight());

    canvas.drawBitmap(view.getDrawingCache(), 0, 0, paint);

    return bitmap;
}

然后,在我的对象的构造函数中,我调用:

public static int loadTexture(final Bitmap bitmap) {
    GLES20.glGenTextures(1, textureHandle, 0);

    if (textureHandle[0] != 0) {
        GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, textureHandle[0]);
        GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D,
                GLES20.GL_TEXTURE_MIN_FILTER, GLES20.GL_NEAREST);
        GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D,
                GLES20.GL_TEXTURE_MAG_FILTER, GLES20.GL_NEAREST);
        GLUtils.texImage2D(GLES20.GL_TEXTURE_2D, 0, bitmap, 0);

        bitmap.recycle();
    }

    if (textureHandle[0] == 0) {
        throw new RuntimeException("Error loading texture.");
    }

    return textureHandle[0];
}

使用更新的布局再次调用loadTexture() 方法会将其呈现为黑色。我写了另一个小方法来尝试不同的方法:

public static int updateTexture(final Bitmap bitmap) {
    GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, textureHandle[0]);
    GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D,
            GLES20.GL_TEXTURE_MIN_FILTER, GLES20.GL_NEAREST);
    GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D,
            GLES20.GL_TEXTURE_MAG_FILTER, GLES20.GL_NEAREST);

    GLUtils.texSubImage2D(GLES20.GL_TEXTURE_2D, 0, 0, 0, bitmap);
    //GLUtils.texImage2D(GLES20.GL_TEXTURE_2D, 0, bitmap, 0);
    // GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, 0);

    return textureHandle[0];
}

这会使原始纹理保持不变,并产生错误:

<qgl2DrvAPI_glTexSubImage2D:502>: GL_INVALID_VALUE
glStartTilingQCOM: 0x501

注释 texSubImage2D() 调用并将其替换为 texImage2D() 不会执行任何操作,并且不会产生错误消息。

如果有人能指出我可能做错了什么,那将不胜感激。

谢谢!

【问题讨论】:

  • 你是从 OpenGL 线程调用更新方法吗?如果使用的是 texSubImage 函数,则无需再次指定纹理参数。
  • @TraxNet 解决了它:我现在注册我想更新纹理,然后在onDraw() 中进行正确的更新。现在我被其他表面上泄漏的新纹理卡住了,但我相信这个新错误与这个问题无关。
  • 我添加了一个答案(复制并粘贴了我的评论),以便您可以将其标记为已解决。关于您的新问题打开一个新问题。最好的问候。
  • 纹理泄漏问题是我不正确地在面之间共享纹理句柄。一个简单的逻辑错误已通过保持该句柄隔离得到修复。
  • 你找到了太好了,继续努力!干杯。

标签: android opengl-es opengl-es-2.0 textures


【解决方案1】:

您是从 OpenGL 线程调用更新方法吗?如果您使用的是 texSubImage 函数,则无需再次指定纹理参数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多