2011-02-13 3 views
0

Supposons que je dessine un cube comme ceci:Comment obtenir les sommets d'un maillage dessiné dans OpenGL ES?

gl.glVertexPointer(3, GL10.GL_FLOAT, 0, mVerticesBuffer); 

     gl.glTranslatef(x, y, z); 
     gl.glRotatef(rz, 0, 0, 1); 
     gl.glRotatef(rx, 1, 0, 0); 
     gl.glRotatef(ry, 0, 1, 0); 

     gl.glDrawElements(GL10.GL_TRIANGLES, mNumOfIndices, 
       GL10.GL_UNSIGNED_SHORT, mIndicesBuffer); 
      float[] result = getVertices(mVerticesBuffer); 

Où mVerticesBuffer est FloatBuffer qui a des sommets du cube. Après avoir fait tourner le cube, je m'attends à ce que la valuse de mVerticesBuffer ait changé et je devrais être capable de récupérer ces valeurs sous la forme d'un tableau flottant. Lorsque j'essaie d'obtenir ces valeurs à partir de mVerticesBuffer, j'obtiens toujours les valeurs qui correspondraient à l'emplacement du cube avant toute translation/rotation. Est-ce qu'il y a une API OpenGL pour obtenir les bonnes valeurs ou est-ce qu'il me manque quelque chose?

Répondre

2

Ce dont vous avez besoin est un cas exact de Transform Feedback (TF): vous voulez récupérer les vertices transformés. C'est parfaitement bien pour l'OpenGL d'aujourd'hui. Voici les instructions pour l'utiliser:

  1. Créer un shader (avec des composants de sommet seulement) qui effectue une transformation de sommet nécessaire. Appelez glTransformFeedbackVaryings avant de lier tell GL sur vos différentes sorties dans un shader que vous souhaitez enregistrer.
  2. Préparer un VBO pour stocker le résultat. Avant de faire TF, appelez glBindBufferBase pour indiquer à GL le stockage pour les valeurs résultantes.
  3. Lors de l'exécution de TF, appelez glBeginTransformFeedback() et enregistrez une requête de type GL_PRIMITIVES_WRITTEN.
+0

Ceci est une excellente réponse, merci! – Jackalope

2

OpenGL n'est pas une bibliothèque mathématique. Il ne fera aucune modification sur les données que vous lui transmettez. Vous pouvez demander le contenu des tampons et autres, mais uniquement sur demande explicite et non sur la façon dont vous vous y attendez. La transformation définie par la matrice modelview et projection, qui sont manipulées à l'aide de glLoadMatrix, glMultMatrix, glTranslate, glRotate, glScale, ces transformations sont appliquées in situ aux positions des vertex uniquement pour le traitement de chaque sommet et ne sont pas stockées constamment. Il y a des commentaires de transformation pour récupérer les données de vertex transformées, mais cela passe par un objet et un tampon OpenGL différents.

+0

Merci. Pouvez-vous dire quel est cet autre objet et tampon OpenGL concernant le retour de la transformation et comment puis-je y avoir accès? – ace

+1

Le retour de transformation n'a de sens que si vous voulez obtenir les résultats des opérations de shader. Si vous voulez juste transformer les sommets par une matrice de transformation statique, implémentez simplement les calculs vous-même. Cela va facilement surclasser OpenGL, puisque la plupart des implémentations OpenGL sont seulement optimisées pour obtenir des choses à l'écran rapidement. – datenwolf

Questions connexes