2011-12-18 12 views
1

私はOpenGLを使い始めるばかりで、いくつかの基本チュートリアルを扱っています。 しかし、私はテクスチャで三角形を作成しようとします。 それは私がクラスGLSurfaceViewIllegalArgumentExceptionを取得する最初の時間glEnableCLientState()を呼び出した後、このIllegalArgumentException GLSurfaceView

public class demo_Textur extends GameActivity implements GameListener 
{ 

    private FloatBuffer vertices; 
    private FloatBuffer texCoords; 
    private int texturID; 
    public void onCreate(Bundle savedInstance) 
    { 
     super.onCreate(savedInstance); 
     setGameListner(this); 
    } 

    @Override 
    public void setup(GameActivity activity, GL10 gl) 
    { 
     ByteBuffer buffer = ByteBuffer.allocate(3*3*4); 
     buffer.order(ByteOrder.nativeOrder()); 
     vertices = buffer.asFloatBuffer(); 

     vertices.put(-0.5f); 
     vertices.put(-0.5f); 
     vertices.put(0); 

     vertices.put(0.5f); 
     vertices.put(-0.5f); 
     vertices.put(0); 

     vertices.put(0); 
     vertices.put(0.5f); 
     vertices.put(0); 

     vertices.rewind(); 

     ByteBuffer textbuffer = ByteBuffer.allocate(3*4*2); 
     textbuffer.order(ByteOrder.nativeOrder()); 
     texCoords = textbuffer.asFloatBuffer(); 

     texCoords.put(0); 
     texCoords.put(1); 

     texCoords.put(1); 
     texCoords.put(1); 

     texCoords.put(0.5f); 
     texCoords.put(0); 

     texCoords.rewind(); 

     Bitmap bitmap = null; 
     try 
     { 
      bitmap = BitmapFactory.decodeStream(getAssets().open("droid.png")); 
     } catch (Exception ex) 
     { 
      Log.d("Texture Sample", "Couldn't load bitmap 'droid.png'"); 
     } 
     int[] texturIDs = new int[1]; 
     gl.glGenTextures(1,texturIDs,0); 
     texturID = texturIDs[0]; 
     gl.glBindTexture(GL10.GL_TEXTURE_2D, texturID); 
     GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, bitmap, 0); 
     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); 
     bitmap.recycle();  
    } 

    @Override 
    public void mainLoopIteration(GameActivity activity, GL10 gl) 
    { 
     gl.glViewport(0, 0, activity.getViewPortWidht(), activity.getViewPortHeight()); 
     gl.glClear(GL10.GL_COLOR_BUFFER_BIT); 

     gl.glEnable(GL10.GL_TEXTURE_2D); 
     gl.glBindTexture(GL10.GL_TEXTURE_2D, texturID); 

     gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY); 
     gl.glTexCoordPointer(2, GL10.GL_FLOAT, 0, texCoords); 

     gl.glEnableClientState(GL10.GL_VERTEX_ARRAY); 
     gl.glVertexPointer(3, GL10.GL_FLOAT, 0, vertices); 

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

    } 
} 

のように見えます。

このようなエラーやアイデアを経験したことがある人はいますか?

答えて

0

mainLoopIteration()では、テクスチャ要素の配列ではなく、直接テクスチャ要素にバインドしてみてください。

//Like this 
gl.glBindTexture(GL10.GL_TEXTURE_2D, texturID[0]); 

//Instead of like this 
//gl.glBindTexture(GL10.GL_TEXTURE_2D, texturID); 
0

あなたはglDrawArrays()後、各有効な状態に対応するglDisableClientState()年代を呼び出す必要も忘れないでください。

また、あなただけ(通常はあなたのGLSurfaceView.RendereronSurfaceChanged()/onSurfaceCreated()中)glViewport()時にビューポートのサイズの変更を設定する必要があります。