2011-12-18 136 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();