2012-02-19 16 views
1

私はAndroidプラットフォームでコーディングしています。三角形のテクスチャ(Assetsフォルダから画像を読み込む)を使用しようとしています。私のアプリケーションを実行すると、三角形の白い空白になります。OpenGL ES:テクスチャを使用:テクスチャイメージの代わりに白い白

私は画像が2の累乗でなければならないと言った他の情報源を読んでいます。そして私はチェックしました、私のイメージは2の威力です。 (128×128)である。それが私に頭痛を引き起こす理由。

はここに私のコードです:ちょうど簡単な例

package com.test; 

import java.io.IOException; 
import java.nio.ByteBuffer; 
import java.nio.ByteOrder; 
import java.nio.FloatBuffer; 

import javax.microedition.khronos.egl.EGLConfig; 
import javax.microedition.khronos.opengles.GL10; 

import android.app.Activity; 
import android.content.res.AssetManager; 
import android.graphics.Bitmap; 
import android.graphics.BitmapFactory; 
import android.opengl.GLSurfaceView; 
import android.opengl.GLSurfaceView.Renderer; 
import android.opengl.GLUtils; 
import android.os.Bundle; 
import android.util.Log; 

public class TextureTriangleTest extends Activity{ 

    GLSurfaceView glView; 
    ByteBuffer byteBuffer; 
    FloatBuffer vertices; 
    AssetManager assets; 

    @Override 
    public void onCreate(Bundle savedInstanceState){ 

     super.onCreate(savedInstanceState); 
     assets = getAssets(); 

     int VERTEX_SIZE = (2+2)*4; 
     byteBuffer = ByteBuffer.allocateDirect(3*VERTEX_SIZE); 
     byteBuffer.order(ByteOrder.nativeOrder()); 
     vertices = byteBuffer.asFloatBuffer(); 
     vertices.put(new float[] { 0.0f, 0.0f, 0.0f, 1.0f, 
            319.0f, 0.0f, 1.0f, 1.0f, 
            160.0f, 479.0f, 0.5f, 0.0f }); 
     vertices.flip(); 

     glView = new GLSurfaceView(this); 
     glView.setRenderer(new Render()); 
     setContentView(glView); 

    } 



    class Render implements Renderer{ 

     @Override 
     public void onDrawFrame(GL10 gl) { 

      try { 

       Bitmap bitmap = BitmapFactory.decodeStream(assets.open("bobrgb888.png")); 
       int textureIds[] = new int[1]; 
       gl.glGenTextures(1, textureIds, 0); 
       int textureId = textureIds[0]; 

       gl.glBindTexture(GL10.GL_TEXTURE_2D, textureId); 
       GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, bitmap, 0); 
       gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER, GL10.GL_NEAREST); 
       gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MAG_FILTER, GL10.GL_NEAREST); 
       gl.glBindTexture(GL10.GL_TEXTURE_2D, 0); 

       bitmap.recycle(); 

      } catch (IOException e) { 
       Log.d("", "FAILED LOAD FILE"); 
       throw new RuntimeException("Couldn't load asset!"); 
      } 

      gl.glViewport(0, 0, glView.getWidth(), glView.getHeight()); 
      gl.glClear(GL10.GL_COLOR_BUFFER_BIT); 
      gl.glMatrixMode(GL10.GL_PROJECTION); 
      gl.glLoadIdentity(); 
      gl.glOrthof(0, 320, 0, 480, 1, -1); 

      gl.glEnableClientState(GL10.GL_VERTEX_ARRAY); 
      gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY); 

      int VERTEX_SIZE = (2+2)*4; 
      vertices.position(0); 
      gl.glVertexPointer(2, GL10.GL_FLOAT, VERTEX_SIZE, vertices); 
      vertices.position(2); 
      gl.glTexCoordPointer(2, GL10.GL_FLOAT, VERTEX_SIZE, vertices); 

      gl.glDrawArrays(GL10.GL_TRIANGLES, 0, 3); 

     } 

     @Override 
     public void onSurfaceChanged(GL10 gl, int width, int height) { 
      // TODO Auto-generated method stub 

     } 

     @Override 
     public void onSurfaceCreated(GL10 gl, EGLConfig config) { 
      // TODO Auto-generated method stub 

     } 

    } 

} 

私のコード(あなたは方法で見るべき主なコードが、それは私がレンダリングに使用するコードが含まれています)。私はデバッグをしており、すべてが真です。 (イメージのロードに成功するなど)。しかし、私はOpenGLアプリケーションをデバッグする方法を知らない。 (つまり、デバッグ時には変数のパラメータを見ることができますが、OpenGLはCanvasよりも複雑すぎるため、1行のコードを使用して結果が得られるので、どのようになるか分かりません:))

助けてくれてありがとう:)

答えて

2

ああ。私は自分のソリューション全体を修正しました。以下は完全なコードです。私は誰が私の長いポスト(^^)を読んで本当の解決策を必要としているのですか?スティーブLのおかげで私に示唆されました:)

私の解決策では、私はいくつかの変更を受けています: 。パフォーマンス:コード読み取りテクスチャをonSurfaceCreateに入れました。 秒。 SteveLが言うように。私はgl.glEnableがなくて、もう一度リセットしましたgl.glBindTexture

もう一度考えてみましょう。私はそれらのエラーが本当にばかげているのを見ています。私は、OpenGL :(

package com.test; 

import java.nio.ByteBuffer; 
import java.nio.ByteOrder; 
import java.nio.FloatBuffer; 

import javax.microedition.khronos.egl.EGLConfig; 
import javax.microedition.khronos.opengles.GL10; 

import android.app.Activity; 
import android.opengl.GLSurfaceView; 
import android.opengl.GLSurfaceView.Renderer; 
import android.os.Bundle; 

public class ColorTriangleTest extends Activity{ 

    GLSurfaceView glView; 
    ByteBuffer byteBuffer; 
    FloatBuffer vertices; 

    public void onCreate(Bundle savedInstanceState){ 

     super.onCreate(savedInstanceState); 

     int VERTEX_SIZE = (2+4)*4; 
     byteBuffer = ByteBuffer.allocateDirect(3*VERTEX_SIZE); 
     byteBuffer.order(ByteOrder.nativeOrder()); 
     vertices = byteBuffer.asFloatBuffer(); 
     vertices.put(new float[] { 0.0f, 0.0f, 1, 0, 0, 1, 
            319.0f, 0.0f, 1, 1, 0, 1, 
            160.0f, 479.0f, 1, 0, 1, 1 }); 
     vertices.flip(); 

     glView = new GLSurfaceView(this); 
     glView.setRenderer(new Render()); 
     setContentView(glView); 
    } 

    class Render implements Renderer { 

     @Override 
     public void onDrawFrame(GL10 gl) { 

      int VERTEX_SIZE = (2+4)*4; 

      gl.glViewport(0, 0, glView.getWidth(), glView.getHeight()); 
      gl.glClear(GL10.GL_COLOR_BUFFER_BIT); 
      gl.glMatrixMode(GL10.GL_PROJECTION); 
      gl.glLoadIdentity(); 
      gl.glOrthof(0, 320, 0, 480, 10, -10); 

      gl.glEnableClientState(GL10.GL_VERTEX_ARRAY); 
      gl.glEnableClientState(GL10.GL_COLOR_ARRAY); 

      vertices.position(0); 
      gl.glVertexPointer(2, GL10.GL_FLOAT, VERTEX_SIZE, vertices); 
      vertices.position(2); 
      gl.glColorPointer(4, GL10.GL_FLOAT, VERTEX_SIZE, vertices); 

      gl.glDrawArrays(GL10.GL_TRIANGLES, 0, 3); 

     } 

     @Override 
     public void onSurfaceChanged(GL10 gl, int width, int height) { 
      // TODO Auto-generated method stub 

     } 

     @Override 
     public void onSurfaceCreated(GL10 gl, EGLConfig config) { 
      // TODO Auto-generated method stub 

     } 

    } 

} 
0

ああ。私は自分の問題を解決しました。しかし、私は理由を説明することはできません。 (私はインターネット上でいくつかのチュートリアルが好きなので私は修正することができます)。

ここに私のコードです。私は変更した行を指摘しました。なぜそれが動作するのか教えてください:

package com.test; 

import java.io.IOException; 
import java.nio.ByteBuffer; 
import java.nio.ByteOrder; 
import java.nio.FloatBuffer; 

import javax.microedition.khronos.egl.EGLConfig; 
import javax.microedition.khronos.opengles.GL10; 

import android.app.Activity; 
import android.content.res.AssetManager; 
import android.graphics.Bitmap; 
import android.graphics.BitmapFactory; 
import android.opengl.GLSurfaceView; 
import android.opengl.GLSurfaceView.Renderer; 
import android.opengl.GLUtils; 
import android.os.Bundle; 
import android.util.Log; 

public class TextureTriangleTest extends Activity{ 

    GLSurfaceView glView; 
    ByteBuffer byteBuffer; 
    FloatBuffer vertices; 
    AssetManager assets; 

    @Override 
    public void onCreate(Bundle savedInstanceState){ 

     super.onCreate(savedInstanceState); 
     assets = getAssets(); 

     int VERTEX_SIZE = (2+2)*4; 
     byteBuffer = ByteBuffer.allocateDirect(3*VERTEX_SIZE); 
     byteBuffer.order(ByteOrder.nativeOrder()); 
     vertices = byteBuffer.asFloatBuffer(); 
     vertices.put(new float[] { 0.0f, 0.0f, 0.0f, 1.0f, 
            319.0f, 0.0f, 1.0f, 1.0f, 
            160.0f, 479.0f, 0.5f, 0.0f }); 
     vertices.flip(); 

     glView = new GLSurfaceView(this); 
     glView.setRenderer(new Render()); 
     setContentView(glView); 

    } 



    class Render implements Renderer{ 

     @Override 
     public void onDrawFrame(GL10 gl) { 

      int a = 0; 
      try { 

       Bitmap bitmap = BitmapFactory.decodeStream(assets.open("bobrgb888.png")); 
       int textureIds[] = new int[1]; 
       gl.glGenTextures(1, textureIds, 0); 
       int textureId = textureIds[0]; 
       a= textureId; 

       gl.glBindTexture(GL10.GL_TEXTURE_2D, textureId); //this line 
       GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, bitmap, 0); 
       gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER, GL10.GL_NEAREST); 
       gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MAG_FILTER, GL10.GL_NEAREST); 
       gl.glBindTexture(GL10.GL_TEXTURE_2D, 0); //and this line 

       bitmap.recycle(); 

      } catch (IOException e) { 
       Log.d("", "FAILED LOAD FILE"); 
       throw new RuntimeException("Couldn't load asset!"); 
      } 

      gl.glViewport(0, 0, glView.getWidth(), glView.getHeight()); 
      gl.glClear(GL10.GL_COLOR_BUFFER_BIT); 
      gl.glMatrixMode(GL10.GL_PROJECTION); 
      gl.glLoadIdentity(); 
      gl.glOrthof(0, 320, 0, 480, 1, -1); 

      //Here two lines that I added. Two lines I have declared above in try_catch 
      //So, WHY I NEED TO DECLARE AGAIN ??!!! 
      gl.glEnable(GL10.GL_TEXTURE_2D); 
      gl.glBindTexture(GL10.GL_TEXTURE_2D, a); 

      gl.glEnableClientState(GL10.GL_VERTEX_ARRAY); 
      gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY); 

      int VERTEX_SIZE = (2+2)*4; 
      vertices.position(0); 
      gl.glVertexPointer(2, GL10.GL_FLOAT, VERTEX_SIZE, vertices); 
      vertices.position(2); 
      gl.glTexCoordPointer(2, GL10.GL_FLOAT, VERTEX_SIZE, vertices); 

      gl.glDrawArrays(GL10.GL_TRIANGLES, 0, 3); 

     } 

     @Override 
     public void onSurfaceChanged(GL10 gl, int width, int height) { 
      // TODO Auto-generated method stub 

     } 

     @Override 
     public void onSurfaceCreated(GL10 gl, EGLConfig config) { 
      // TODO Auto-generated method stub 

     } 

    } 

} 

それは私のために今働く:)誰が理由を説明することができますか??

+2

の初心者だという理由だけであなたはgl.glEnable(GL10.GL_TEXTURE_2D)を使用していませんでした。...試行でキャッチをプラスします(試しに...キャッチ)のテクスチャをunbinded (GL10.GL_TEXTURE_2D、0); – SteveL

+2

なぜフレームごとにテクスチャを読み込むのですか?onTurfaceCreated()内にon..ry部分を入れて、 – SteveL

関連する問題