Après avoir cherché et lire sur Modern OpenGL afin de mettre à niveau mon projet existant, je suis un peu confus, depuis mon cadre 3D basé sur OpenGL 2.1.
Ainsi, autant que j'apprends ... P >
Nous devons générer nos objets tampons de vertex des sommets, des indices, des normales, des couleurs, des UV, etc. p> li>
Ensuite, nous pouvons utiliser GLM pour la transformation matricielle et nous n'utilisons que VBO pour créer ou manipuler des mailles, enfin nous transmettons tout dans GLSL Vertex Shader comme celui-ci ... P>
> 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
4 Réponses :
Oui, si vous avez besoin de transformations hiérarchiques, vous devez le faire par vous-même. Cependant, c'est à peu près trivial si tout ce dont vous avez besoin est une pile. Prenez simplement la dernière entrée de la pile et multipliez-la avec la matrice suivante que vous souhaitez appliquer et appuyez sur le résultat sur la pile. P>
[sur votre question modifiée]: Vous n'avez pas besoin d'une pile pour cela, et il n'y a pas non plus de transformation hiérarchique. Avoir une matrice unique et appliquer votre traduction, dessiner, le multiplier avec votre matrice de rotation, dessiner, multiplier votre échelle, dessiner. P>
Euh? Si vous avez la matrice initiale M, et la traduction T, la rotation R et la balance S, puis votre première matrice est m = t, la seconde est m * = r = (t r == traduction en premier, rotation de seconde), et le troisième est M * = S = (T i> R * S == Toutes les matrices.) Pour un bras de robot, vous pouvez aussi bien commencer au sommet et émettre des appels de dessiner en descendant votre arbre. Peu importe si la "pile" est une pile STD :: Stack ou une partie de votre routine traférante de scène récursive.
Si vous ne faites pas de m * = S, mais utilisez simplement M S (copier!) Puis la matrice d'origine n'est pas modifiée. Votre pile ressemblerait à ceci: [m], puis vous poussez t (résultant dans une pile [m, m i> t]), puis vous faites pop ([m]), puis poussez à nouveau r ([M, M * R]). Je n'ai pas ton problème?
Arrêtez d'éditer la signification de vos commentaires. J'ai dit que vous pouvez la mettre en œuvre via une pile, vous pouvez simplement copier vos matrices à l'intérieur de votre fonction de tirage récursive (qui crée implicitement une pile.) Le [m, ..] est une pile i>, si Vous voulez cela, utilisez-le simplement. Mais vous pouvez facilement vous échapper sans aucune STD :: Stack aussi.
Laissez-nous Continuer cette discussion en chat
Si votre rendu se produit déjà hiérarchiquement en utilisant, par exemple, la récursion de fonction, vous avez déjà une pile matricielle!
void renderMesh(Matrix transform, Mesh mesh) { // here call glDrawElements/glDrawArrays and send transform matrix to MVP uniform mesh->draw(transform); // now render all the sub-meshes, then will be transformed relative to current mesh for (int i=0; i<mesh->subMeshCount(); i++) { Matrix subMeshTransform = mesh->getSubMeshTransform(i); Mesh subMesh = mesh->getSubMesh(); renderMesh(subMeshTransform * transform, subMesh); } } // somwhere in main function ... Matrix projection = Matrix::perspective(...); Matrix view = camera->getViewMatrix(); Matrix transform = view * projectIon; renderMesh(transform, rootMesh);
- Nous devons générer nos objets tampons Vertex à partir de sommets, d'indices, de normales, de couleurs, de UV, etc. li> ul>
Il n'est pas vraiment nécessaire d'utiliser VBO, les tableaux Vertex côté client travaillent également. Cependant, il est fortement recommandé d'utiliser VBO, car cela facilitera la vie du conducteur et à long terme. La surcharge de code est négligeable (il s'agit de la même manière que la génération et le téléchargement de données de texture) et les performances ne seront qu'augmenter. P>
- Nous pouvons ensuite utiliser GLM pour la transformation matricielle et nous n'utilisons que VBO pour créer ou manipuler des mailles, enfin nous transmettons tout dans GLSL Vertex Shader comme celui-ci ... Li> ul> BlockQuote>
Vous n'êtes pas limité à GLM. Toute bibliothèque de mathématiques de matrice fera. Si vous recherchez quelque chose que vous pouvez utiliser en C99, consultez mon (toujours incomplet)
linmath.h code> https://github.com/datenwolf/lithmath.h qui est juste un fichier d'en-tête avec
fonctions statiques code>. Je n'ai pas encore de référence si la duplication de code a un impact négatif sur les performances (la taille du code crée une pression de cache L1). P>
Question: Strong> Comment nous faisons des transformations hiérarchiques sans PushMatrix / PopMatrix? (Ou peut-être que nous faisons-nous une transformation hiérarchique en utilisant nos vbos, est-ce possible?) P> BlockQuote> Les VBO n'ont rien à voir avec cela. Ce qui donne à la plupart des utilisateurs de problèmes Old Fashioned OpenGL sont ces fonctions de pile matricielles, ce qui rend OpenGL regarder un peu comme un graphique de scène. Mais ce n'est pas le cas. P>
Si vous oubliez la pile matricielle d'Old OpenGL, il devient évident comment faire des transactions hiérarchiques: à chaque branche de la hiérarchie, effectuez une copie de la matrice de transformation et de fonctionner à ce sujet. Vous obtenez un arbre hiérarchique de transformations, à chaque nœud, la matrice correspondante stockée. Ensuite, vous passez ces matrices comme des uniformes sur le sommet du sommet; Ou une seule matrice si vous dessinez un objet rigide qui n'a qu'une transformation. Plusieurs matrices que vous n'avez normalement besoin que de déformables, telles que l'animation squelettique d'un personnage comme celle-ci p>
xxx pré> à chaque fois que vous avez énouvez un
-> code> dans une telle hiérarchie que vous faites. une copie de la matrice et continuez de travailler sur celui-là. Lorsque vous revenez à un niveau supérieur de l'arbre, vous commencez à travailler à nouveau à la matrice. P> blockquote>
"Déformation faciale" // C'est tout un chapitre de son propre => Comprend une goutte de mâchoire :)
En ce qui concerne les performances VAO et VBO, je suis en désaccord que VBO est plus rapide, je suggère de voir ce lien p>
http://www.openglsuperbible.com/2013/12 / 09 / Vertex-Array-Performance / P>
Vous pouvez voir des résultats ci-dessus que, du moins pour notre petit ensemble d'échantillons, VAO est plus rapide sur toutes les implémentations. Il convient à la raison - il y a moins de paramètres à valider lorsque vous appelez GLBINTERTEXARRAY que GLBindbuffer ou GLVERXATTRIBPOINKER. Même lorsqu'il n'y a qu'un seul attribut sommet, il y a la moitié de nombreux appels dans OpenGL avec un commutateur VAO qu'avec la mise à jour explicite d'un VAO global. Outre les "autres appels d'API" évidents, une relation d'exécution plus rapide ", la VAO est un lieu où un conducteur OpenGL peut conserver des informations conçues pour programmer le GPU sous-jacent. La quantité totale des changements d'état envoyés au GPU est la même de la même manière. Em> p>
Comment est-ce lié à la question?
@ Bјовић: OpenGL Mathématiques (GLM) , une bibliothèque C ++ en-tête uniquement pour matrice / Math Math.