2011-08-09 4 views
3

Je suis quelque chose de nouveau à OpenGL ES et je veux construire un cube simple, mais semble avoir quelques problèmes en laissant le tampon d'octets d'indice que je veux avoir 4 TRIANGLE_FANs différents, comment pourrais-je allez à faire cette/réécriture mon code:cube android/openGL avec GL_TRIANGLE_FAN

public class GLCube{ 

private float vertices[] = { 
    1, 1, -1, //p0 - topFrontRight 
    1, -1, -1, //p1 bottomFront Right 
    -1, -1, -1, //p2 bottom front left 
    -1, 1, -1, //p3 front top left 
    1, 1, 1, //p4 - topBackRight 
    1, -1, 1, //p5 bottomBack Right 
    -1, -1, 1, //p6 bottom back left 
    -1, 1, 1, //p7 front back left 
}; 

private FloatBuffer vertBuff; 

private short[] pIndex = { 
     0, 4, 1, 3, //i0 fan of top front right 
     5, 4, 1, 6, //i1 fan from bottom right back 
     2, 1, 3, 6, //i2 fan from bottom left front 
     7, 3, 4, 6 //i3 fan from top left back 
}; 

private ShortBuffer pBuff; 

public GLCube(){ 

    ByteBuffer bBuff = ByteBuffer.allocateDirect(vertices.length * 4); 
    bBuff.order(ByteOrder.nativeOrder()); 
    vertBuff = bBuff.asFloatBuffer(); 
    vertBuff.put(vertices); 
    vertBuff.position(0); 


    ByteBuffer pbBuff = ByteBuffer.allocateDirect(pIndex.length * 2); 
    pbBuff.order(ByteOrder.nativeOrder()); 
    pBuff = pbBuff.asShortBuffer(); 
    pBuff.put(pIndex); 
    pBuff.position(0); 
} 

public void draw(GL10 gl){ 
    gl.glFrontFace(GL10.GL_CW); 
    gl.glEnableClientState(GL10.GL_VERTEX_ARRAY); 
    gl.glVertexPointer(3, GL10.GL_FLOAT, 0, vertBuff); 
    gl.glDrawElements(GL10.GL_TRIANGLE_FAN, pIndex.length, GL10.GL_UNSIGNED_SHORT, pBuff); 
    gl.glDisableClientState(GL10.GL_VERTEX_ARRAY); 

} 
} 

Je suppose que vous devez utiliser GL10.GL_PRIMITIVE_RESTART, mais avec Android, je ne pense pas que cela existe ...

Répondre

3

vous avez raison dans votre hypothèse, sans extension primitive_restart vous ne pouvez pas rendre plusieurs fans de triangle en un seul appel à glDrawElements. Ce que vous pouvez faire est d'utiliser glMultiDrawElements, où vous pouvez dessiner plusieurs primitives dans un appel, mais son utilisation est un peu lourde et je ne suis pas sûr si cela vous donne vraiment un avantage sur une seule liste de triangles (surtout avec ce simple cube). Le conseil général que je vous donnerais est de rester à l'écart des primitives compliquées comme les bandes triangulaires et les ventilateurs, car elles ne sont utiles que pour certaines petites géométries spéciales (celles pour lesquelles vous n'obtiendrez aucun avantage de performance). Les maillages généraux plus grands nécessitent beaucoup plus d'efforts pour tirer un avantage réel de ces types primitifs, le cas échéant. Utilisez simplement une simple liste de triangles indexés et tout va bien. A propos, si vous voulez vraiment une tessellation "sophistiquée" d'un cube, vous pouvez construire un cube à partir d'une seule bande de triangle, mais la solution à cela dépend de vous ou de google. Il suffit de regarder la spécification GLES et il semble que les fonctions glMultiDraw... ont été supprimées dans ES. Il n'y a donc pas moyen de contourner une seule liste de triangles indexés (ou la solution de triangles), du moins si vous voulez dessiner le cube en un seul appel, ce qui est conseillé.

+0

Salut Christian, merci beaucoup pour votre réponse! Comme je l'ai dit, je suis assez nouveau à OpenGL, et votre réponse réfléchie a beaucoup aidé. Merci encore – travis

+0

@ user848162 Si cela a aidé, un vote à la hausse (et peut-être accepter) serait apprécié. –

+0

Je pense vraiment que la raison en est que les fans ont une utilisation extrêmement limitée, et ils étaient surtout utiles lors de la programmation manuelle des formes lors de l'utilisation du mode immédiat ('glBegin()/glEnd()'). Cela expliquerait pourquoi Microsoft [dépouillé des fans de triangle dans D3D10] (http://gamedev.stackexchange.com/questions/35547/why-are-triangle-fans-not-supported-in-direct3d-10-or-later) – bobobobo