Android空白纹理(延迟加载纹理)

时间:2013-04-05 14:20:09

标签: android opengl-es textures

我有一个GLSurfaceView,我在那里渲染我的场景。我的场景显示正确,除了一些纹理,我有白色方块而不是真正的纹理。我使用2种纹理:

  • 某些纹理位于项目的资源中。我在onSurfaceCreated中创建它们,一切都可以正常使用
  • 需要从远程位置下载其他一些内容。那些纹理无法正确显示。

我使用以下代码下载并创建“延迟纹理”:

public void onDrawFrame(GL10 gl) {
    ...
    Texture3D.getDynamicTexture(gl, object.avatar).bind(gl);
    ...
}


public static Texture3D getDynamicTexture(GL10 gl, int key) {
    Texture3D texture =  dynamicTextures.get(key);

    if (texture == null) {
        dynamicTextures.put(key, new Texture3D(gl, key, Type.DYNAMIC));
        texture = getStaticTexture(R.drawable.broken_img);
    }

    return texture;
}


public Texture3D(final GL10 gl, final int id, Type type) {
    gl.glEnable(GL10.GL_TEXTURE_2D);

    gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_NICEST);
    texture = newTextureID(gl);
    gl.glBindTexture(GL10.GL_TEXTURE_2D, texture);
    gl.glTexParameterx(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_S, GL10.GL_CLAMP_TO_EDGE);
    gl.glTexParameterx(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_T, GL10.GL_CLAMP_TO_EDGE);
    gl.glTexParameterx(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER, GL10.GL_LINEAR);
    gl.glTexParameterx(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MAG_FILTER, GL10.GL_LINEAR);

    gl.glBlendFunc(GL10.GL_SRC_ALPHA, GL10.GL_ONE_MINUS_SRC_ALPHA);

    Utils.loadImage(id, new SimpleImageLoadingListener() {

        @Override
        public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) {
            _pBitmap = loadedImage;
            GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, _pBitmap, 0);

            _pBitmap = null;
            gl.glEnable(GL10.GL_BLEND);
        }

    });

我看到下载有效,因为R.drawable.broken_img被白色方块取代了。纹理似乎出现了,但它们都堆叠在屏幕顶部的一条线上(见图)。

Stacked textures on top of the screen

我也试过了Android OpenGL ES 1.1 white box textures,但这也没用。我看到的唯一区别是纹理不再出现在屏幕上方。

1 个答案:

答案 0 :(得分:0)

我通过添加2个布尔标志(imageLoaded,textureCreated)解决了这个问题。那些标志允许我首先下载图像,然后一旦我有图像我创建纹理(创建纹理的所有代码都在“相同”时间执行)。