2013-04-05 79 views
0

我有一個GLSurfaceView渲染我的場景。我的場景正確顯示,除了一些紋理,我有白色方塊而不是真實紋理。我使用兩種紋理:Android空白紋理(延遲加載紋理)

  • 某些紋理位於項目的資源中。我創建它們在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但也不能工作。我看到的唯一區別是紋理不再出現在屏幕上。

回答

0

我通過添加2個布爾標誌(imageLoaded,textureCreated)解決了這個問題。這些標誌允許我首先下載圖像,然後只要有圖像,我就創建了紋理(所有創建紋理的代碼都在「相同」時間執行)。