2013-04-05 3 views
0

나는 내 장면을 렌더링하는 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을 시도했지만 그 중 하나가 작동하지 않았다. 내가 본 유일한 차이점은 텍스처가 화면 상단에 더 이상 나타나지 않는다는 것입니다.

답변

0

2 개의 부울 플래그 (imageLoaded, textureCreated)를 추가하여이 문제를 해결했습니다. 이러한 플래그를 사용하면 먼저 이미지를 다운로드 한 다음 이미지가 생성되는 즉시 텍스쳐를 생성합니다 (텍스쳐를 생성하는 모든 코드는 "동일한"시간에 실행 됨).

관련 문제