2012-02-18 17 views
1

私はOpenGL ESを学んでいます。三角形のテクスチャを使用しているときにエラーが発生します。ここに私のコードは次のとおりです。Android - OpenGL ES:三角形をテクスチャする方法

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; 

public class TexttureTriangleTest extends Activity{ 

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

    public void onCreate(Bundle savedInstanceState){ 

     super.onCreate(savedInstanceState); 
     assetManager = 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, 1, 0, 0, 1, 
            319.0f, 0.0f, 0, 1, 0, 1, 
            160.0f, 479.0f, 0, 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) { 

      try { //I think error in this block of code 

       Bitmap bitmap = BitmapFactory.decodeStream(assetManager.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) { 
       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(340, 0, 420, 0, 0, 0); 

      gl.glEnableClientState(GL10.GL_VERTEX_ARRAY); 
      gl.glEnableClientState(GL10.GL_COLOR_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 

     } 

    } 

} 

私は機能にし、ブロックコードtry-catchに誤りを満たしていると思います。誰が私のためにそれを確認し、それを修正する方法を教えてください。

感謝:)

答えて

1

私はOpenGLで偉大な専門家ではないが、限り、私はここに見ることができるようにヨールコード内のいくつかのミスです。 最初はそれがあなたのvertices配列あなたの必要性18 * 4バイトサイズのByteBufferの

int VERTEX_SIZE = (2+2)*4; 
byteBuffer = ByteBuffer.allocateDirect(3*VERTEX_SIZE); 

のための間違ったサイズです。 18はverticesの浮動小数点数であり、4はその配列内のすべての浮動小数点数のバイト数です。

2番目の理由で、try-catchでエラーが発生したと思われますか? IDEのログイン画面でエラー行を探します。ここに投稿すると、問題が確認できます。 bobrgb888.pngファイルがアセットフォルダに存在する必要があります。

+2

「18」の理由をさらに詳しく説明できますか?私は '2 + 2'と考えています。なぜなら、1つは通常の座標用で、もう1つはテクスチャ座標用です。 – hqt

+0

18は 'vertices'サイズしかありませんが、あなたのプログラムでは助けがありません。 OpenGLでは、頂点、テクスチャの頂点、および面に関するチュートリアルや例を読む必要があります。このようなもの[リンク] http://obviam.net/index.php/opengl-es-android-displaying-graphical-elements-primitives/ [リンク] – dimetil

+0

このリンクhttp://obviam.net/index.php/ OpenGL-es-android-displaying-グラフィック要素 - プリミティブ/ – dimetil

関連する問題