2012-10-07 4 views
0

J'essaie de dessiner des triangles mais pour une raison quelconque, je n'ai que l'arrière-plan. Qu'est-ce qui me manque?OpenGL ES 1.0 Dessin de vertice simple

Voici mon code. Il a 2 tampons qui sont créés lorsque onDrawFrame est appelé pour la première fois et qui chargent des données de vertex et de triangle à partir d'une ArrayList ou ArrayList que j'ai créée en chargeant un fichier .OBJ.

public FloatBuffer fb = null; // To be loaded once in the first draw 
    public ShortBuffer ib = null; 

    @Override 
    public void onDrawFrame(GL10 gl) 
     { 
     gl.glEnable(GL10.GL_DEPTH_TEST); 
     gl.glEnable(GL10.GL_LINE_SMOOTH); 
     gl.glEnable(GL10.GL_POINT_SMOOTH); 


     // Clear white 
     gl.glClearColor(1,0,0,1); 
     gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);    

     // Look At 
     gl.glPushMatrix(); 
     gl.glMatrixMode(GL10.GL_MODELVIEW); 
     gl.glLoadIdentity(); 
     GLU.gluLookAt(gl, 0, 0, -4, 0, 0, 0, 0,1.0f,0); 
     try 
      { 
      gl.glColor4f(1.0f,1.0f,0,1.0f); 
      int nv = SomeVertexArray.size(); 
      int nt = SomeTriangleArray.size(); 
     if (fb == null) 
      { 
      int TotalFBByteSize = 4*3*nv; 
      fb = ByteBuffer.allocateDirect(TotalFBByteSize).order(ByteOrder.nativeOrder()).asFloatBuffer(); 
      fb.clear(); 
      for(int i = 0 ; i < SomeVertexArray.size() ; i++) 
       { 
       VERTEX v = SomeVertexArray.get(i); 
       fb.put(v.x); 
       fb.put(v.y); 
       fb.put(v.z); 
       } 
      } 
     if (ib == null) 
      { 
      int TotalTRByteSize = 4*3*nt; 
      ib = ByteBuffer.allocateDirect(TotalTRByteSize).order(ByteOrder.nativeOrder()).asShortBuffer(); 
      ib.clear(); 
      for(int i = 0 ; i < nt ; i++) 
       { 
       TRIANGLE v = SomeTriangleArray.get(i); 
       ib.put((short)v.i1); 
       ib.put((short)v.i2); 
       ib.put((short)v.i3); 
       } 
      } 


     gl.glEnableClientState(GL10.GL_VERTEX_ARRAY); 
     gl.glVertexPointer(3, GL10.GL_FLOAT, 0,fb); 
     gl.glDrawElements(GL10.GL_TRIANGLES, nt*3, GL10.GL_UNSIGNED_SHORT,ib); 
     gl.glDisableClientState(GL10.GL_VERTEX_ARRAY); 
      } 
     catch(Throwable ex) 
      { 
      ex.printStackTrace(); 
      } 
     gl.glPopMatrix(); 
     gl.glFlush(); 

     } 


    @Override 
    public void onSurfaceChanged(GL10 gl, int width, int height) 
     { 
     gl.glViewport(0, 0, width, height); 
       gl.glMatrixMode(GL10.GL_PROJECTION); 
     gl.glLoadIdentity(); //reset projection matrix 
        GLU.gluPerspective(gl,54.0f, (float)width/(float)height, 1.0f, 1000.0f); 
     gl.glMatrixMode(GL10.GL_MODELVIEW); //set modelview matrix 
     gl.glLoadIdentity(); //reset modelview matrix 
     } 
+0

Avez-vous défini une matrice de projection? – Tim

+0

Oui, j'ai modifié le message original. – Michael

Répondre

1

Le problème a été résolu en utilisant fb.put (float []) au lieu de fb.put (float), soit en faisant passer l'ensemble du réseau vertice/triangle à la mémoire tampon à la fois directement et non pas à l'intérieur de la boucle.

Je ne sais pas pourquoi, mais cela a fonctionné.