2011-09-14 8 views
2

OpenGLを初めて使い、Android用のAugmented-realityアプリケーションを開発しています。四角形のテクスチャとしてテキストを描画しても何も表示されない

これまでは、カメラに垂直な白い四角形を描いていたため、ユーザーは「興味のあるポイント」の方向に向いていました。

今、私はいくつかのテキストを四角形に表示しようとしています。

私は多くを読んだことがあります。テキストを使ってテクスチャを作成するのが最も直接的で最も簡単なアプローチなので、興味のあるポイントのデータを取得してすぐにテクスチャを作成しています彼らの四角。そのために、私はビットマップを使用します。

コードを見てみましょう。

public void onDrawFrame(GL10 gl) { 

     // Get sensors matrix 
       ... 


     //Clear Screen And Depth Buffer 
     gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT); 

     // Load remapped matrix 
     gl.glMatrixMode(GL10.GL_MODELVIEW); 



     // List of Points of interest (modified when some data is downloaded) 
     synchronized (poiList) { 

      if(mNewData){ // True if new data has been dowloaded) 
       if(textures != null) // Delete old textures 
        gl.glDeleteTextures(textures.length, textures, 0); 

       textures = loadGLTexture(gl, soapPoiList.getPoiList()); 
       mNewData = false; 
      } 

      int i = 0; 
      // Iterate the list 
      for (PointOfInterest c : poiList) { 

         gl.glLoadIdentity(); 
       gl.glLoadMatrixf(remappedRotationMatrix, 0); 

       // Get bearing 
          ... 

       // Place polygon in the right place 
       gl.glRotatef(-bearing, 0, 0, 1); 
       gl.glTranslatef(0, ICONS_SIZE_RATIO, 0); 

         // Actually draws the polygon with text 
       c.draw(gl, textures[i]); 

       i++; 
      } 
     } 
    } 

loadGLTexturesである場合:

protected int[] loadGLTexture(GL10 gl, List<PointOfInterest> l){ 
    int res[] = new int[l.size()]; 
    gl.glGenTextures(res.length, res, 0); 
    int i = 0; 

    for(PointOfInterest p : l) { 
     Bitmap bitmap = Bitmap.createBitmap(256, 256, Bitmap.Config.RGB_565); 
     bitmap.eraseColor(Color.BLACK); 

     Canvas canvas = new Canvas(bitmap); 

     Paint textPaint = new Paint(); 
     textPaint.setTextSize(35); 
     textPaint.setFakeBoldText(true); 
     textPaint.setAntiAlias(true); 
     textPaint.setARGB(255, 255, 255, 255); 
     // Draw the text centered 
     canvas.drawText(Float.toString(p.getDinstanceToOrigin()) + " m.", 10,35, textPaint); 

     // Bind the texture to our array 
     gl.glBindTexture(GL10.GL_TEXTURE_2D, res[i]); 

     // Create Nearest Filtered Texture 
     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_CLAMP_TO_EDGE); 

     GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, bitmap, 0); 

     bitmap.recycle(); 

     i++; 
    } 
    return res; 
} 

それは基本的に関心の各ポイントのビットマップを作成し、それにテクスチャを生成する私のonDrawFrame方法の中で、私はこのような何かを行います。それは、このクラスに示されるようにテクスチャが、後に白い四角の上に適用されます。

public class PointOfInterest { 

     // MEMBERS ---------------------------------------------------------------- 
      .... 
      .... 

     // OpenGL necessary variables 
     /** The buffer holding the vertices */ 
     private FloatBuffer vertexBuffer; 

     /** The initial vertex definition */ 
     private float vertices[] = { 
            -1.0f, 0.0f, -1.0f, //Bottom Left V1 
            -1.0f, 0.0f, 1.0f, //Top Left  V2 
            1.0f, 0.0f, -1.0f, //Bottom Right V3 
            1.0f, 0.0f, 1.0f, //Top Right  V4 
            }; 

     private FloatBuffer textureBuffer; 
     private float texture[] = { 
            0.0f, 0.0f,  // V1 
            1.0f, 0.0f,  // V3 
            0.0f, 1.0f,  // V2 
            1.0f, 1.0f  // V4 
     }; 

     // CONSTRUCTORS ----------------------------------------------------------- 

     public PointOfInterest(Location originLocation){ 
      currentLocation = originLocation; 

      mPoiLocation = new Location(LocationManager.GPS_PROVIDER); 

      ByteBuffer byteBuf = ByteBuffer.allocateDirect(vertices.length * 4); 
      byteBuf.order(ByteOrder.nativeOrder()); 

      vertexBuffer = byteBuf.asFloatBuffer(); 
      vertexBuffer.put(vertices); 
      vertexBuffer.position(0); 

      byteBuf = ByteBuffer.allocateDirect(texture.length * 4); 
      byteBuf.order(ByteOrder.nativeOrder()); 

      textureBuffer = byteBuf.asFloatBuffer(); 
      textureBuffer.put(texture); 
      textureBuffer.position(0); 
     } 

     // PUBLIC METHODS --------------------------------------------------------- 

     public void draw(GL10 gl, int textureId){ 
      // Bind the previously generated texture 
      gl.glBindTexture(GL10.GL_TEXTURE_2D, textureId); 

      // Point to our buffers 
      gl.glEnableClientState(GL10.GL_VERTEX_ARRAY); 
      gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY); 

      // set the colour for the square 
      //gl.glColor4f(0.0f, 0.1f, 0.0f, 0.5f); 

      //Set the face rotation 
      gl.glFrontFace(GL10.GL_CW); 

      //Point to our vertex buffer 
      gl.glVertexPointer(3, GL10.GL_FLOAT, 0, vertexBuffer); 
      gl.glTexCoordPointer(2, GL10.GL_FLOAT, 0, textureBuffer); 

      //Draw the vertices as triangle strip 
      gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, vertices.length/3); 

      //Disable the client state before leaving 
      gl.glDisableClientState(GL10.GL_VERTEX_ARRAY); 
      gl.glDisableClientState(GL10.GL_TEXTURE_COORD_ARRAY); 
     } 

     .... 
     .... 
} 

私は、それが成功しませんherehereを教えているようテクスチャをマッピングすることを試みました。私は実際に四角に描かれた手紙を取るために何をすべきかわからず、ここで本当に失われています...おそらくテクスチャが生成されていないかもしれない、四角形のもう一方の面にテキストが描かれています...わからない。

どんな種類のヘルプでも非常に感謝しています。

+0

コードをどこかからコピーしましたか?あなたは、あなたがOpenGLを初めて使うと言っています。あなたがそれをコピーしたら、おそらくあなたはその過程で何かを逃したでしょう。 – Ronnie

+0

私は非常に簡単な例を作りました。静的な正方形で、テクスチャにテキストが付いています。今、私はそのサンプルを自分のアプリケーションに適用しています。私は何かを見逃しても何百回もチェックしたが、何も見ない – Pedriyoo

答えて

2

私はテクスチャマッピングを有効にするのを忘れていました。 GL10オブジェクトを使用するメソッド内で実行できます。私はオブジェクトの描画メソッド内でそれを行うことを好むので、他のオブジェクトはテクスチャの影響を受けません。これは簡単です(ちょうど2行変更されました、NEWと言うもの!!):

public void draw(GL10 gl, int textureId){ 
    gl.glEnable(GL10.GL_TEXTURE_2D); //NEW !!! Enable Texture Mapping 

    // Bind the previously generated texture 
    gl.glBindTexture(GL10.GL_TEXTURE_2D, textureId); 

    // Point to our buffers 
    gl.glEnableClientState(GL10.GL_VERTEX_ARRAY); 
    gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY); 

    // set the colour for the square 
    //gl.glColor4f(0.0f, 0.1f, 0.0f, 0.5f); 

    //Set the face rotation 
    gl.glFrontFace(GL10.GL_CW); 

    //Point to our vertex buffer 
    gl.glVertexPointer(3, GL10.GL_FLOAT, 0, vertexBuffer); 
    gl.glTexCoordPointer(2, GL10.GL_FLOAT, 0, textureBuffer); 

    //Draw the vertices as triangle strip 
    gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, vertices.length/3); 

    //Disable the client state before leaving 
    gl.glDisableClientState(GL10.GL_VERTEX_ARRAY); 
    gl.glDisableClientState(GL10.GL_TEXTURE_COORD_ARRAY); 

    gl.glDisable(GL10.GL_TEXTURE_2D); ////NEW !!! Disable texture mapping 
}