2016-06-28 15 views
0

ボタンクリックに応答して、自分のOpenGLビューでオブジェクトに表示されるテクスチャイメージを変更しようとしています。現在、ユーザーがボタンを押すと、OpenGLレンダラースレッドでフラグをtrueに設定します。私のクロススレッド通信はうまくいくようです:レンダラースレッドのフラグ変数を自由に切り替えることができました。私の問題はOpen GL onDraw()ワークフローのようだが、レンダラの最初のonSurfaceCreated()の実行中にテクスチャが既に設定された後、オブジェクトのテクスチャを体系的に変更する方法を理解することはできない。Android:OpenGL ESテクスチャイメージを動的に変更する方法

fretBoardTexture =新しいOpenGL_TextureData(mActivityContext、R.drawable.dark_wood)と思われます。 onSurfaceCreated()の外では決して動作しません、なぜですか?

以下は、私が試したコードです。 GLES20()メソッド呼び出しのシーケンスがどこかにありませんか?解決

のOpenGLレンダラクラス

private int chosenWoodColor = 1; 

     public void onSurfaceCreated(GL10 glUnused, EGLConfig config) { 
      ... 
      loadFretBoardTexture(); //this call works: it succeeds in changing texture 
     } 

     public void onDrawFrame(GL10 glUnused) { 
       if (flag){  
        loadFretBoardTexture(); //this call fails: it never changes the texture 
       } 
       ... 

       //***Fretboard OpenGL_TextureData Binding*** 
       GLES20.glActiveTexture(GLES20.GL_TEXTURE1); 

       // Bind the texture to this unit. 
       GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, fretBoard._textureID); 

       //Draw Background 
       Matrix.setIdentityM(mModelMatrix, 0); 
       Matrix.translateM(mModelMatrix, 0, 0.0f, 0.0f, -1.0f); 
       drawFretBoard(); //draw the fretboard 
       ... 
     } 

     public void loadFretBoardTexture(){ 
       switch (chosenWoodColor){ 
        case 1: 
         fretBoardTexture = new OpenGL_TextureData(mActivityContext, R.drawable.dark_wood); 
         break; 
        case 2: 
         fretBoardTexture = new OpenGL_TextureData(mActivityContext, R.drawable.medium_wood); 
         break; 
        case 3: 
         fretBoardTexture = new OpenGL_TextureData(mActivityContext, R.drawable.light_wood); 
         break; 
       } 
       setFretboardTextureRefresh(false); 
       return; 
      } 

テクスチャデータヘルパクラス

public class OpenGL_TextureData { 
    public int textureID; 
    public float imageWidth, imageHeight; 

    public OpenGL_TextureData(Context context, int resourceId) { //constructor 
     final int[] textureHandle = new int[1]; 

     GLES20.glGenTextures(1, textureHandle, 0); 

     if (textureHandle[0] != 0) { 
      final BitmapFactory.Options options = new BitmapFactory.Options(); 
      options.inScaled = false; // No pre-scaling 

      // Read in the resource 
      final Bitmap bitmap = BitmapFactory.decodeResource(context.getResources(), resourceId, options); 

      //fetch texture image width & height 
      imageWidth = options.outWidth; 
      imageHeight = options.outHeight; 

      // Bind to the texture in OpenGL 
      GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, textureHandle[0]); 

      // Set filtering 
      GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_S, GLES20.GL_REPEAT); 
      GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_T, GLES20.GL_REPEAT); 
      GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MIN_FILTER, GLES20.GL_LINEAR); 
      GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MAG_FILTER, GLES20.GL_LINEAR); 

      // Load the bitmap into the bound texture. 
      GLUtils.texImage2D(GLES20.GL_TEXTURE_2D, 0, bitmap, 0); 

      // Recycle the bitmap, since its data has been loaded into OpenGL. 
      bitmap.recycle(); 
     } 

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

     textureID = textureHandle[0]; 
    } 
} 

答えて

0

問題は、新しいテクスチャオブジェクトを作成してビットマップをロードしていたのですが、テクスチャオブジェクトがすでにonSurfaceCreated()メソッドで作成されていたため、これは望ましくありませんでした。既に存在するテクスチャオブジェクト。

私は私のテクスチャデータヘルパークラスに次のメソッドを追加しました:here

から引き出され

public void updateTexture(Context context, int resourceId) { 
     final BitmapFactory.Options options = new BitmapFactory.Options(); 
     options.inScaled = false; // No pre-scaling 
     final Bitmap bitmap = BitmapFactory.decodeResource(context.getResources(), resourceId, options); //Read in the resource 
     GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, 1); 
     // Load the bitmap into the bound texture. 
     GLUtils.texImage2D(GLES20.GL_TEXTURE_2D, 0, bitmap, 0); 
     bitmap.recycle(); 
    } 

インスピレーションを

関連する問題