This shows you the differences between two versions of the page.
egc:laboratoare:fr:02 [2019/10/09 17:22] alexandru.gradinaru created |
egc:laboratoare:fr:02 [2019/10/10 05:09] (current) alexandru.gradinaru [Vertex Buffer Object (VBO)] |
||
---|---|---|---|
Line 88: | Line 88: | ||
==== Vertex Buffer Object (VBO) ==== | ==== Vertex Buffer Object (VBO) ==== | ||
- | Un vertex buffer object reprezintă un container în care stocăm date ce țin de conținutul vârfurilor precum: | + | Un vertex buffer object (objet tampon de sommet) représente un conteneur dans lequel nous stockons des données liées au contenu des sommets, telles que: |
- | * poziție | + | * position |
- | * normală | + | * normal |
- | * culoare | + | * couleur |
- | * coordonate de texturare | + | * coordonnées de texture |
* etc... | * etc... | ||
- | Un vertex buffer object se poate crea prin comanda OpenGL **[[https://www.opengl.org/sdk/docs/man/html/glGenBuffers.xhtml|glGenBuffers]]**: | + | Un vertex buffer object peut être créé à l'aide de la commande OpenGL **[[https://www.opengl.org/sdk/docs/man/html/glGenBuffers.xhtml|glGenBuffers]]**: |
<code cpp> | <code cpp> | ||
- | GLuint VBO_ID; // ID-ul (nume sau referinta) buffer-ului ce va fi cerut de la GPU | + | GLuint VBO_ID; // L'ID (nom ou référence) du tampon qui sera requis du GPU |
- | glGenBuffers(1, &VBO_ID); // se genereaza ID-ul (numele) bufferului | + | glGenBuffers(1, &VBO_ID); // l'identifiant de tampon (nom) est généré |
</code> | </code> | ||
<note> | <note> | ||
- | Așa cum se poate vedea și din explicația API-ului, funcția [[https://www.opengl.org/sdk/docs/man/html/glGenBuffers.xhtml|glGenBuffers]] primește numărul de buffere ce trebuie generate cât și locația din memorie unde vor fi salvate referințele (ID-urile) generate.\\ | + | Comme vous pouvez le voir dans l'explication de l'API, la fonction [[https://www.opengl.org/sdk/docs/man/html/glGenBuffers.xhtml|glGenBuffers]] reçoit le nombre de tampons à générer et l'emplacement en mémoire où les références générées (ID) seront sauvegardées.\\ |
- | În exemplul de mai sus este generat doar 1 singur buffer iar ID-ul este salvat în variabila ''VBO_ID''. | + | Dans l'exemple ci-dessus, un seul tampon est généré et l'ID est enregistré dans la variable ''VBO_ID''. |
</note> | </note> | ||
- | Pentru a distruge un VBO și astfel să eliberăm memoria de pe **GPU** se folosește comanda **[[https://www.opengl.org/sdk/docs/man4/html/glDeleteBuffers.xhtml|glDeleteBuffers]]**: | + | Pour détruire un VBO et libérer ainsi la mémoire du **GPU** utiliser la commande **[[https://www.opengl.org/sdk/docs/man4/html/glDeleteBuffers.xhtml|glDeleteBuffers]]**: |
<code cpp> | <code cpp> | ||
glDeleteBuffers(1, &VBO_ID); | glDeleteBuffers(1, &VBO_ID); | ||
</code> | </code> | ||
- | Pentru a putea pune date într-un buffer trebuie întâi să legăm acest buffer la un „target”. Pentru un vertex buffer acest „binding point” se numește **GL_ARRAY_BUFFER** și se poate specifica prin comanda **[[https://www.khronos.org/opengles/sdk/1.1/docs/man/glBindBuffer.xml|glBindBuffer]]**: | + | Pour pouvoir mettre les données dans un tampon, nous devons d’abord lier ce tampon à un „target”. Pour un vertex buffer this „binding point” ça s'appelle **GL_ARRAY_BUFFER** et peut être spécifié par la commande **[[https://www.khronos.org/opengles/sdk/1.1/docs/man/glBindBuffer.xml|glBindBuffer]]**: |
<code cpp> | <code cpp> | ||
Line 117: | Line 117: | ||
</code> | </code> | ||
- | În acest moment putem să facem upload de date din memoria **CPU** către **GPU** prin intermediul comenzii **[[https://www.opengl.org/sdk/docs/man4/html/glBufferData.xhtml|glBufferData]]**: | + | À ce stade, nous pouvons télécharger des données de la mémoire du **CPU** au **GPU** à travers la commande **[[https://www.opengl.org/sdk/docs/man4/html/glBufferData.xhtml|glBufferData]]**: |
<code cpp> | <code cpp> | ||
Line 123: | Line 123: | ||
</code> | </code> | ||
- | * Comanda citește de la adresa specificată, în exemplul de sus fiind adresa primului vârf ''&vertices[0]'', și copiază în memoria video dimensiunea specificată prin parametrul al 2-lea. | + | * La commande lit à partir de l'adresse spécifiée, dans l'exemple ci-dessus étant l'adresse du premier sommet ''&vertices[0]'', et copier dans la mémoire vidéo la taille spécifiée par le paramètre 2. |
- | * **GL_STATIC_DRAW** reprezintă un hint pentru driver-ul video în ceea ce privește metoda de utilizare a bufferului. Acest simbol poate avea mai multe valori dar în cadrul laboratorului este de ajuns specificarea prezentată. Mai multe informații găsiți pe pagina de manual a funcției [[https://www.opengl.org/sdk/docs/man4/html/glBufferData.xhtml|glBufferData]] | + | * **GL_STATIC_DRAW** représente un indice pour le pilote vidéo sur l'utilisation du tampon. Ce symbole peut avoir plusieurs valeurs, mais dans le laboratoire il suffit pour la spécification présentée. Plus d'informations peuvent être trouvées sur la page de manuel de fonction [[https://www.opengl.org/sdk/docs/man4/html/glBufferData.xhtml|glBufferData]] |
<note tip> | <note tip> | ||
- | Pentru a înțelege mai bine API-ul OpenGL vă rocomandăm să citiți documentația indicată pentru fiecare comandă prezentată. Atunci când se prezintă o nouă comandă, dacă apăsați click pe numele acesteia veți fi redirecționați către pagina de manual a comenzii respective.\\ | + | Pour mieux comprendre l'API OpenGL, nous vous recommandons de lire la documentation fournie avec chaque commande soumise. Quand une nouvelle commande est soumise, si vous cliquez sur son nom, vous serez redirigé vers la page de manuel de cette commande.\\ |
- | De asemenea, documentația oficială și completă a API-ului OpenGL poate fi gasită pe pagina **[[https://www.opengl.org/sdk/docs/man/|OpenGL 4 Reference Pages]]** | + | En outre, la documentation officielle et complète de l’API OpenGL est disponible sur la page **[[https://www.opengl.org/sdk/docs/man/|OpenGL 4 Reference Pages]]** |
</note> | </note> | ||
==== Index Buffer Object (IBO) ==== | ==== Index Buffer Object (IBO) ==== | ||
- | Un index buffer object (numit și element buffer object) reprezintă un container în care stocăm indicii vertecșilor. Cum **VBO** si **IBO** sunt buffere, ele sunt extrem de similare în construcție, încărcare de date și ștergere. | + | Un index buffer object (objet tampon d’index) est un conteneur dans lequel nous stockons des sommets. Comme **VBO** si **IBO** sont des tampons, ils sont extrêmement similaires dans leur construction, leur chargement et leur suppression. |
<code cpp> | <code cpp> | ||
Line 142: | Line 142: | ||
</code> | </code> | ||
- | La fel ca la VBO, creăm un IBO și apoi îl legăm la un punct de legatură, doar că de data aceasta punctul de legatură este **GL_ELEMENT_ARRAY_BUFFER**. Datele sunt trimise către bufferul mapat la acest punct de legatură. În cazul indicilor toți vor fi de dimensiunea unui singur întreg. | + | Comme avec VBO, nous créons un IBO et le lions ensuite à un point de connexion, mais cette fois, le point de connexion est **GL_ELEMENT_ARRAY_BUFFER**. Les données sont envoyées au tampon mappé à ce point de liaison. Dans le cas des index, tous auront la taille d'un seul entier. |
==== Vertex Array Object (VAO) ==== | ==== Vertex Array Object (VAO) ==== | ||
- | Într-un vertex array object putem stoca toată informația legată de starea geometriei desenate. Putem folosi un număr mare de buffere pentru a stoca fiecare din diferitele atribute („separate buffers”). Putem stoca mai multe (sau toate) atribute într-un singur buffer („interleaved” buffers). În mod normal înainte de fiecare comandă de desenare trebuie specificate toate comenzile de „binding” pentru buffere sau atribute ce descriu datele ce doresc a fi randate. Pentru a simplifica această operație se folosește un vertex array object care ține minte toate aceste legături. | + | Dans un vertex array object (objet tableau de sommets) nous pouvons stocker toutes les informations relatives à l'état de la géométrie dessinée. Nous pouvons utiliser un grand nombre de tampons pour stocker chacun des différents attributs („separate buffers”). Nous pouvons stocker plusieurs attributs (ou tous) dans un seul tampon („interleaved” buffers). Normalement, avant chaque commande de dessin, toutes les commandes "de liaison" pour les tampons ou les attributs décrivant les données à restituer doivent être spécifiées. Pour simplifier cette opération, on utilise un objet tableau de sommets prenant en compte tous ces liens. |
- | Un vertex array object este creat folosind comanda **[[https://www.opengl.org/sdk/docs/man4/html/glGenVertexArrays.xhtml|glGenVertexArrays]]**: | + | Un objet tableau de sommets est créé à l'aide de la commande **[[https://www.opengl.org/sdk/docs/man4/html/glGenVertexArrays.xhtml|glGenVertexArrays]]**: |
<code cpp> | <code cpp> | ||
Line 155: | Line 155: | ||
</code> | </code> | ||
- | Este legat cu **[[https://www.opengl.org/sdk/docs/man4/html/glBindVertexArray.xhtml|glBindVertexArray]]**: | + | Il est lié à **[[https://www.opengl.org/sdk/docs/man4/html/glBindVertexArray.xhtml|glBindVertexArray]]**: |
<code cpp>glBindVertexArray(VAO);</code> | <code cpp>glBindVertexArray(VAO);</code> | ||
<hidden> | <hidden> | ||
- | Și este distrus cu **[[https://www.opengl.org/sdk/docs/man4/html/glDeleteVertexArrays.xhtml|glDeleteVertexArrays]]**: | + | Et il est détruit avec **[[https://www.opengl.org/sdk/docs/man4/html/glDeleteVertexArrays.xhtml|glDeleteVertexArrays]]**: |
<code cpp>glDeleteVertexArrays(1, &VAO);</code> | <code cpp>glDeleteVertexArrays(1, &VAO);</code> | ||
</hidden> | </hidden> | ||
<note tip> | <note tip> | ||
- | Înainte de a crea VBO-urile și IBO-ul necesar pentru un obiect se va lega VAO-ul obiectului și acesta va ține minte automat toate legăturile specificate ulterior. | + | Avant de créer les VBO et l'IBO requis pour un objet, le VAO de l'objet sera lié et il se souviendra automatiquement de tous les liens spécifiés ultérieurement. |
- | După ce toate legăturile au fost specificate este recomandat să se dea comanda ''glBindVertexArray(0)'' pentru a dezactiva legătura către VAO-ul curent, deoarece altfel riscăm ca alte comenzi OpenGL ulterioare să fie legate la același VAO și astfel să introducem foarte ușor erori în program. | + | Une fois tous les liens spécifiés, il est recommandé de commander ''glBindVertexArray(0)'' désactiver le lien avec le VAO actuel, car sinon, nous risquons que d'autres commandes OpenGL ultérieures soient liées au même VAO, ce qui facilitera grandement les erreurs dans le programme. |
</note> | </note> | ||
- | Înainte de comanda de desenare este suficient să legăm doar VAO-ul ca OpenGL să știe toate legatările create la construcția obiectului. | + | Avant la commande de dessin, il suffit de lier uniquement le VAO pour qu'OpenGL connaisse toutes les liaisons créées lors de la construction de l'objet. |
- | ===== Laborator 2 ===== | + | ===== Laboratoire 2 ===== |
- | ==== Descriere laborator ==== | + | ==== Description du laboratoire ==== |
- | În cadrul laboratorului vom învăța să folosim **VAO, VBO, IBO** și astfel să generăm și încărcăm geometrie simplă.\\ | + | En laboratoire, nous allons apprendre à utiliser **VAO, VBO, IBO** et ainsi nous générons et chargeons une géométrie simple.\\ |
- | Laboratorul pune la dispoziție structura [[https://github.com/UPB-Graphics/Framework-EGC/blob/master/Source/Core/GPU/Mesh.h#L14|VertexFormat]] ce va fi utilizată ca bază pentru a crea geometria. | + | Le laboratoire fournit la structure [[https://github.com/UPB-Graphics/Framework-EGC/blob/master/Source/Core/GPU/Mesh.h#L14|VertexFormat]] qui servira de base à la création de la géométrie. |
<code cpp> | <code cpp> | ||
Line 195: | Line 195: | ||
</code> | </code> | ||
- | Clasa ''Mesh'' pune la dispoziție posibilitatea de a încărca geometrie simplă folosind diverse metode: | + | La classe ''Mesh'' offre la possibilité de télécharger une géométrie simple en utilisant diverses méthodes: |
<code cpp> | <code cpp> | ||
- | // Initializes the mesh object using a VAO GPU buffer that contains the specified number of indices | + | // Initialise l'objet maillé à l'aide d'un tampon VAO GPU contenant le nombre spécifié d'index. |
bool InitFromBuffer(unsigned int VAO, unsigned short nrIndices); | bool InitFromBuffer(unsigned int VAO, unsigned short nrIndices); | ||
- | // Initializes the mesh object and upload data to GPU using the provided data buffers | + | // Initialise l'objet maillé et télécharge les données sur les GPU à l'aide des tampons de données fournis. |
bool InitFromData(std::vector<VertexFormat> vertices, | bool InitFromData(std::vector<VertexFormat> vertices, | ||
std::vector<unsigned short>& indices); | std::vector<unsigned short>& indices); | ||
- | // Initializes the mesh object and upload data to GPU using the provided data buffers | + | // Initialise l'objet maillé et télécharge les données sur les GPU à l'aide des tampons de données fournis. |
bool InitFromData(std::vector<glm::vec3>& positions, | bool InitFromData(std::vector<glm::vec3>& positions, | ||
std::vector<glm::vec3>& normals, | std::vector<glm::vec3>& normals, | ||
Line 211: | Line 211: | ||
</code> | </code> | ||
<note tip> | <note tip> | ||
- | Taste de control pentru cameră | + | Touches de contrôle pour la camerá |
- | * **W, A, S, D, Q, E** - deplasare față, stânga, spate, dreapta, jos, sus | + | * **W, A, S, D, Q, E** - avant, gauche, arrière, droite, bas, haut |
- | * **MOUSE RIGHT + MOUSE MOVE** - rotație cameră | + | * **MOUSE RIGHT + MOUSE MOVE** - rotation de la camerá |
- | **F3** - afișează/ascunde gridul din scenă \\ | + | **F3** - affiche / masque la grille dans la scène \\ |
- | **Space** - desenează primitivele doar prin **puncte** sau **linii** (wireframe) sau **geometrie opacă** | + | **Space** - dessiner des primitives uniquement par **points** ou **lignes** (wireframe) ou **géométrie opaque** |
</note> | </note> | ||
- | ==== Cerințe laborator ==== | + | ==== Tâches de laboratoire ==== |
<note important> | <note important> | ||
- | Toate cerințele ce țin de încărcare de geometrie trebuie rezolvate prin intermediul funcției ''Laborator2::CreateMesh'' dar puteți folosi metodele ''Mesh::InitFromData()'' pentru a verifica validitatea geometriei. | + | Toutes les tâches de chargement de géométrie doivent être résolues par la fonction ''Laborator2::CreateMesh'' mais vous pouvez utiliser les méthodes ''Mesh::InitFromData()'' pour vérifier la validité de la géométrie. |
</note> | </note> | ||
- | - Descărcați [[https://github.com/UPB-Graphics/Framework-EGC/archive/master.zip|framework-ul de laborator]] | + | - Télécharger [[https://github.com/UPB-Graphics/Framework-EGC/archive/master.zip|le cadre de laboratoire]] |
- | - Completați geometria și topologia unui cub: vectorii de vertecși și indecși din inițializare. ''VertexFormat'' este o structură pentru vertex cu 2 parametrii (poziție, culoare). | + | - Complétez la géométrie et la topologie d'un cube: les sommets et les vecteurs d'index de l'initialisation. ''VertexFormat'' est une structure de sommet avec 2 paramètres (position, couleur). |
- | - Completați funcția ''Laborator2::CreateMesh'' astfel încât să încărcați geometria pe GPU | + | - Compléter la fonction ''Laborator2::CreateMesh'' afin que vous puissiez charger la géométrie sur le GPU |
- | * creați un VAO | + | * créer un VAO |
- | * creați un VBO și adăugați date în el | + | * créer un VBO et y ajouter des données |
- | * creați un IBO și adăugați date în el | + | * créer un IBO et y ajouter des données |
- | * afișați noul obiect (RenderMesh[cube3]) astfel încât să nu se suprapună cu un alt obiect | + | * afficher le nouvel objet (RenderMesh[cube3]) afin qu'il ne chevauche pas un autre objet |
- | - Creați o nouă formă geometrică simplă, de exemplu un tetraedru și desenați-l în scenă | + | - Créez une nouvelle forme géométrique simple, telle qu'un tétraèdre, et dessinez-la dans la scène. |
- | - Atunci când se apasă tasta **F2** faceți toggle între modul de culling **GL_BACK** și **GL_FRONT** | + | - Lorsque la touche **F2** est enfoncée basculer entre le mode de sélection **GL_BACK** et **GL_FRONT** |
- | * nu uitați să activați și să dezactivați face culling folosind ''glEnable()'' / ''glDisable()'' | + | * n'oubliez pas d'activer et de désactiver l'utilisation de la sélection ''glEnable()'' / ''glDisable()'' |
- | - Creați un pătrat format din 2 triunghiuri astfel încât fiecare triunghi să fie vizibil doar dintr-o parte | + | - Créez un carré composé de 2 triangles de manière à ce que chaque triangle ne soit visible que d'un côté |
- | * în orice moment de timp nu trebuie să se vadă decât 1 triunghi | + | * A tout moment, il ne faut voir qu'un seul triangle |
<hidden> | <hidden> |