2011-11-15 3 views
0

J'ai beaucoup travaillé sur DirecX avec des maillages, mais je n'arrive pas à comprendre ce qui se passe avec mes triangles dans OpenGL ES. J'ai essayé d'utiliser des exemples de boîtes du web ainsi que les données d'une boîte que j'avais dans un ancien projet, mais elles sortent toujours mal, et souvent invisibles.Problèmes de maillage OpenGL ES sous Android

Voici un exemple.

avec les Verts:

-25.0 -25.0 25.0 
25.0 -25.0 25.0 
-25.0 25.0 25.0 
25.0 25.0 25.0 

et indices (à partir de 0):

2 1 3 

Je reçois un triangle qui est des points d'angle droit à un angle complètement différent de l'écran que celui qu'il me donne si j'utilise les indices:

3 1 2 

Selon ma compréhension, il ne devrait même pas être showi ng un triangle si les sommets sont listés dans l'ordre CW avec ma config courante. Des indices sur ce qui se passe avec ces verts ???

BTW, voici mon code de dessin:

gl.glFrontFace(GL10.GL_CCW); 
gl.glEnable(GL10.GL_CULL_FACE); 
gl.glCullFace(GL10.GL_BACK); 

gl.glEnableClientState(GL10.GL_VERTEX_ARRAY); 
gl.glVertexPointer(3, GL10.GL_FLOAT, 0, vertexBuffer); 
//gl.glColor4f(1.0f,0.0f,1.0f,1.0f); 
gl.glDrawElements(GL10.GL_TRIANGLES, indexCount, GL10.GL_UNSIGNED_SHORT, indexBuffer); 
gl.glDisableClientState(GL10.GL_VERTEX_ARRAY); 
gl.glDisable(GL10.GL_CULL_FACE); 

modifier:

3 1 2 tire un coin pointant vers le haut à gauche et 2 1 3 tractant une pointant vers le haut à droite, mais seulement selon l'un est listé en premier est dessiné. Cela devient tellement bizarre ...

{ 
public void initAndStuff(...) 
{ 
    try{ 
     // 
     ... 
     They get initialized up here... 
     This is also where the external data is fed in (but is erased below) 
     // 

     //////////////////////////////// 
     vertexBuffer.clear(); 
     indexBuffer.clear(); 

     vertexBuffer.put(-25.0f); 
     vertexBuffer.put(-25.0f); 
     vertexBuffer.put(25.0f); 

     vertexBuffer.put(25.0f); 
     vertexBuffer.put(-25.0f); 
     vertexBuffer.put(25.0f); 

     vertexBuffer.put(-25.0f); 
     vertexBuffer.put(25.0f); 
     vertexBuffer.put(25.0f); 

     vertexBuffer.put(25.0f); 
     vertexBuffer.put(25.0f); 
     vertexBuffer.put(25.0f); 


     indexBuffer.put(3); 
     indexBuffer.put(1); // points toward top left 
     indexBuffer.put(2); 
     indexBuffer.put(2); 
     indexBuffer.put(1); // points toward top right 
     indexBuffer.put(3); 


     indexIndex = 6; 
     ////////////////////////////////// 


     // wrap things up 
     vertexBuffer.position(0); 
     indexBuffer.position(0); 

    } 
    catch(Exception e) 
    { 
     e.printStackTrace(); 
     Toast.makeText(context,"exception in loadfile",Toast.LENGTH_LONG).show(); 
     return false; 
    } 
    return true; 
} 

public final void draw(GL10 gl) 
{ 
    gl.glFrontFace(GL10.GL_CCW); 
    gl.glEnable(GL10.GL_CULL_FACE); 
    gl.glCullFace(GL10.GL_BACK); 

    gl.glEnableClientState(GL10.GL_VERTEX_ARRAY); 
    gl.glVertexPointer(3, GL10.GL_FLOAT, 0, vertexBuffer); 
    //gl.glColor4f(1.0f,0.0f,1.0f,1.0f); 
    gl.glDrawElements(GL10.GL_TRIANGLES, indexIndex, GL10.GL_UNSIGNED_SHORT, indexBuffer); 
    gl.glDisableClientState(GL10.GL_VERTEX_ARRAY); 
    gl.glDisable(GL10.GL_CULL_FACE); 

} 
} 
+0

Quelles sont les données contenues dans 'vertexBuffer' et' indexBuffer'? Bien sûr, nous pouvons le deviner, mais en le voyant, nous nous assurerons qu'ils contiennent des données correctes et qu'ils sont du bon type. Et le reste du code pourrait aussi être interressant. –

+0

J'ai effectivement vérifié les tampons et ils contiennent les données correctes dans l'ordre indiqué. Je mettrais tout mon code ici mais il serait trop facile de me perdre dans la procédure massive que j'ai écrite pour lire les données d'un fichier (que j'ai testé intensivement). J'ai également essayé de charger manuellement les données dans les tampons (pas à partir d'un fichier séparé) et les résultats sont tout aussi confus. – user980058

+0

Mais dans ce cas, vous devrez peut-être être satisfait d'une question sans réponse, car le code que je peux voir semble raisonnable. Un exemple minimal qui reproduit le problème serait suffisant. –

Répondre

0

C'était parce que j'initialisés mon court tampon comme un tampon int.

+0

En fait, je devinais ça et ça C'était la raison pour laquelle je voulais voir tout le code d'initialisation. Peut-être que j'aurais juste dû le dire. –