2011-12-18 3 views
1

방금 ​​OpenGL을 시작했고 일부 기본 자습서에서 작업합니다. 그러나 Textur로 삼각형을 만들려고합니다. 내가 클래스 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() 년대를 호출해야합니다.

또한 뷰포트 크기가 변경되면 glViewport()으로 설정해야합니다 (보통 onSurfaceChanged()/onSurfaceCreated(), GLSurfaceView.Renderer).

관련 문제