2011-12-18 137 views
1

我剛剛開始使用OpenGL,並在一些基礎教程上工作。 但是我嘗試用紋理創建一個三角形。 它看起來像這樣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); 

    } 
} 

調用第一次glEnableCLientState()我得到的類GLSurfaceViewIllegalArgumentException後。

有沒有人有這種錯誤或想法的經驗問題可能是什麼?

回答

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()的每個啓用狀態。

此外,您只需在視口尺寸發生變化時(通常在onSurfaceChanged()/onSurfaceCreated()中您的GLSurfaceView.Renderer)設置glViewport();