2012-02-28 19 views
1

OpenGL ES 1.0を使用してゲームを作成しています。最近タブレットをAndroid 4.0.3にアップデートしました。今ではすべてのテクスチャが黒く表示されます。私は、ハードウェアアクセラレーションのオン/オフを試してみましたが、違いはありません。アイスクリームサンドウィッチのOpenGLブラックテクスチャ

テクスチャをロードするためのコードです。

 public void loadTexture(GL10 gl, Context context, int image, boolean has_alpha) { 
      m_alpha = has_alpha; 

      int [] textures = new int[1]; 
      gl.glDeleteTextures(1, textures, 0); 
      gl.glGenTextures(1, textures, 0); 
      m_textureid = textures[0]; 

      gl.glBindTexture(GL10.GL_TEXTURE_2D, m_textureid); 

      gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER, GL10.GL_LINEAR); 
      gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MAG_FILTER, GL10.GL_LINEAR); 

      gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_S, GL10.GL_CLAMP_TO_EDGE); 
      gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_T, GL10.GL_REPEAT); 

      Bitmap bmp = BitmapFactory.decodeResource(context.getResources(), image); 
      GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, bmp, 0); 
      bmp.recycle(); 

    } 

これは私のコードをレンダリングするためのコードです。

 public void render(GL10 gl, float rotation) { 
      gl.glPushMatrix(); 


      gl.glEnable(GL10.GL_TEXTURE_2D); 
      // Tell OpenGL where our texture is located. 
      gl.glBindTexture(GL10.GL_TEXTURE_2D, m_textureid); 
      // Tell OpenGL to enable the use of UV coordinates. 
      gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY); 
      // Telling OpenGL where our UV coordinates are. 
      gl.glTexCoordPointer(2, GL10.GL_FLOAT, 0, textureVB); 

      if(m_3d) { 
      // Counter-clockwise winding. 
        gl.glFrontFace(GL10.GL_CCW); 
        // Enable face culling. 
        gl.glEnable(GL10.GL_CULL_FACE); 
        // What faces to remove with the face culling. 
        gl.glCullFace(GL10.GL_BACK); 
      } 

      gl.glEnableClientState(GL10.GL_VERTEX_ARRAY); 
      // Specifies the location and data format of an array of vertex 
      // coordinates to use when rendering. 
      gl.glVertexPointer(3, GL10.GL_FLOAT, 0, vertexVB); 
      // Set flat color 
      gl.glColor4f(1.0f, 1.0f, 1.0f, 1.0f); 
      // Smooth color 
      if (colorVB != null) { 
        if(m_alpha) { 
         gl.glEnable(GL10.GL_BLEND); 
         gl.glBlendFunc(GL10.GL_SRC_ALPHA, GL10.GL_ONE_MINUS_SRC_ALPHA); 
        } 
        // Enable the color array buffer to be used during rendering. 
        gl.glEnableClientState(GL10.GL_COLOR_ARRAY); 
        gl.glColorPointer(4, GL10.GL_FLOAT, 0, colorVB); 
      } 

      gl.glTranslatef(m_a.m_pos.x + m_dist_x, m_a.m_pos.y + m_dist_y, m_a.m_pos.z + m_dist_z); 
      gl.glRotatef(rotation, 0.0f, 0.0f, 1.0f); 

      // Point out the where the color buffer is. 
      gl.glDrawElements(GL10.GL_TRIANGLES, indicies.length, 
          GL10.GL_UNSIGNED_SHORT, indexVB); 



      // Disable the vertices buffer. 
      gl.glDisableClientState(GL10.GL_VERTEX_ARRAY); 
      if(m_alpha) { 
       gl.glDisable(GL10.GL_BLEND); 
      } 

      if(m_3d) { 
        // Disable face culling. 
        gl.glDisable(GL10.GL_CULL_FACE); 
      } 

      // Disable the use of UV coordinates. 
      gl.glDisableClientState(GL10.GL_TEXTURE_COORD_ARRAY); 
      // Disable the use of textures. 
      gl.glDisable(GL10.GL_TEXTURE_2D); 
      //gl.glPopMatrix(); 
      gl.glPopMatrix(); 
    } 
+0

GL実装がアップデートで変更されている可能性があります。テクスチャは正方形で、ピクセルの幅/高さは2の累乗ですか? – user8709

+0

テクスチャのいくつかは2の累乗である大きさの正方形ですが、2つのテクスチャの非力と同じように黒です。 – user1234320

答えて

4

私はこの問題を解決しました。私は、レンダリングされる2つのサイズのパワーであるすべてのテクスチャを許可

  Bitmap bmp = null; 
      InputStream is = context.getResources().openRawResource(image); 
      try { 
       bmp = BitmapFactory.decodeStream(is); 
      } finally { 
       try { 
        is.close(); 
        is = null; 
       } catch(IOException e) { 

       } 
      } 

に置き換え、次のコード

Bitmap bmp = BitmapFactory.decodeResource(context.getResources(), image);

でビットマップをロードしました。サイズが2でないテクスチャはレンダリングされません。 OpenGL ES 1.0/1.1では、2テクスチャの非パワーを扱うことはできません。タブレットがハニカムを実行しているときに、なぜ私がそれらをレンダリングできるのかまだ分かりません。

EDIT:

私は、OpenGL ES 1.0を使用してレンダリングする2つのテクスチャの非電源を取得する方法を発見しました。次の機能をGL_CLAMP_TO_EDGEに設定する必要があります

 gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_S, GL10.GL_CLAMP_TO_EDGE); 
    gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_T, GL10.GL_CLAMP_TO_EDGE); 
+0

+1のGL_CLAMP_TO_EDGE – Commander3000