OpenGL moderne: stacks VBO, GLM et Masortingx

Après avoir cherché et lu des informations sur Modern OpenGL afin de mettre à niveau mon projet existant, je suis un peu perplexe depuis mon framework 3D basé sur OpenGL 2.1.

donc, autant que je sache …

QUESTION: Comment faisons-nous des transformations hiérarchiques sans pushMasortingx / popMasortingx? (ou peut-être que nous faisons une transformation hiérarchique en utilisant nos VBO, est-ce possible?)

Si ce n’est pas possible, comment obtenir le même résultat que pushMasortingx / popMasortingx en utilisant les bibliothèques GLM et C ++ ?

Disons que j’ai besoin de quelque chose comme ça:

 > Set identity > Translate to X, Y, Z > Draw Mesh 1 > Rotate 0.5 by X axis > Draw Mesh 2 > Scale down to 0.1 > Draw Mesh 3 

  • Nous devons générer nos objects Vertex-Buffer-Objects à partir de sumts, indices, normales, couleurs, uvs, etc.

Il n’est pas vraiment nécessaire d’utiliser des VBO, les Vertex Arrays côté client fonctionnent également. Cependant, il est fortement recommandé d’utiliser VBO, car cela simplifie la vie du conducteur et, à long terme, vous incarnez celui qui doit jongler avec les données. La surcharge de code est négligeable (c’est à peu près la même chose que générer et télécharger des données de texture) et les performances ne feront qu’augmenter.

  • alors nous pouvons utiliser GLM pour la transformation de masortingce, et nous utilisons uniquement VBO pour créer ou manipuler des maillages, pour finir, nous passons tout dans GLSL vertex shader comme ceci …

Vous n’êtes pas limité à GLM. Toute bibliothèque mathématique masortingcielle fera l’affaire. Si vous cherchez quelque chose que vous pouvez utiliser dans C99, jetez un œil à mon linmath.h (encore incomplet) https://github.com/datenwolf/linmath.h, qui n’est qu’un fichier d’en-tête avec static inline fonctions static inline . Je n’ai pas encore testé si la duplication de code avait un impact négatif sur les performances (la taille du code crée une pression de cache N1).

QUESTION: Comment faisons-nous des transformations hiérarchiques sans pushMasortingx / popMasortingx? (ou peut-être que nous faisons une transformation hiérarchique en utilisant nos VBO, est-ce possible?)

Les VBO n’ont rien à voir avec cela. Ce sont les fonctions de stack de masortingce qui donnent à la plupart des utilisateurs de problèmes OpenGL à l’ancienne une apparence qui ressemble un peu à un graphe de scène. Mais ce n’est pas.

Si vous oubliez la stack masortingcielle de l’ancien OpenGL, vous apprendrez comment effectuer des transformations hiérarchiques: À chaque twig de la hiérarchie, effectuez une copie de la masortingce de transformation et utilisez-la. Vous obtenez une arborescence hiérarchique de transformations, à chaque nœud la masortingce correspondante stockée. Ensuite, vous transmettez ces masortingces sous forme d’uniformes au vertex shader; ou juste une masortingce si vous dessinez un object rigide qui n’a qu’une transformation. Plusieurs masortingces dont vous n’avez normalement besoin que pour les déformables, comme l’animation squelettique d’un personnage comme celui-ci

 worldtransform -> pelvis -> left upper leg -> left lower leg -> left foot right upper leg -> right lower leg -> right foot torso -> neck -> head -> left eye right eye facial deformation // this is a whole chapter of it's own left upper arm -> left lower arm -> left hand right upper arm -> right lower arm -> right hand 

Chaque fois que vous rencontrez un -> dans une telle hiérarchie, vous faites une copie de la masortingce et continuez à travailler sur celle-ci. Lorsque vous revenez à un niveau supérieur de l’arbre, vous recommencez à travailler à partir de cette masortingce.

Oui, si vous avez besoin de transformations hiérarchiques, vous devez le faire vous-même. Cependant, c’est assez sortingvial si tout ce dont vous avez besoin est une stack. Prenez simplement la dernière entrée de la stack et multipliez-la avec la prochaine masortingce que vous souhaitez appliquer, puis placez le résultat dans la stack.

[Sur votre question modifiée]: Vous n’avez pas du tout besoin d’une stack, et il n’y a pas non plus de transformation hiérarchique. Ayez simplement une masortingce et appliquez votre traduction, dessinez, multipliez-la avec votre masortingce de rotation, dessinez, multipliez votre mise à l’échelle, dessinez.

Si votre rendu se produit déjà de manière hiérarchique en utilisant, par exemple, une fonction de récursivité, vous disposez déjà d’une stack de masortingce!

 void renderMesh(Masortingx transform, Mesh mesh) { // here call glDrawElements/glDrawArrays and send transform masortingx to MVP uniform mesh->draw(transform); // now render all the sub-meshes, then will be transformed relative to current mesh for (int i=0; isubMeshCount(); i++) { Masortingx subMeshTransform = mesh->getSubMeshTransform(i); Mesh subMesh = mesh->getSubMesh(); renderMesh(subMeshTransform * transform, subMesh); } } // somwhere in main function ... Masortingx projection = Masortingx::perspective(...); Masortingx view = camera->getViewMasortingx(); Masortingx transform = view * projectIon; renderMesh(transform, rootMesh); 

En ce qui concerne les performances VAO et VBO, je ne suis pas d’accord sur le fait que VBO est plus rapide, je suggère de voir ce lien.

http://www.openglsuperbible.com/2013/12/09/vertex-array-performance/

Les résultats ci-dessus montrent que, du moins pour notre petit échantillon, VAO est plus rapide sur toutes les implémentations. Il va sans dire: il y a moins de parameters à valider lors de l’appel de glBindVertexArray que glBindBuffer ou glVertexAtsortingbPointer. Même lorsqu’il n’y a qu’un seul atsortingbut de sumt, il y a deux fois moins d’appels dans OpenGL avec un commutateur VAO qu’avec une mise à jour explicite d’un VAO global. Outre la relation évidente «moins d’appels d’API signifie une exécution plus rapide», le VAO est un endroit où un pilote OpenGL peut stocker les informations nécessaires à la programmation du GPU sous-jacent. Le nombre total de changements d’état envoyés au GPU est identique dans les deux cas.