Differences

This shows you the differences between two versions of the page.

Link to this comparison view

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 referintabuffer-ului ce va fi cerut de la GPU + GLuint VBO_ID;​ // ​L'ID (nom ou référencedu tampon qui sera requis du GPU 
- glGenBuffers(1,​ &​VBO_ID);​ // ​se genereaza ID-ul (numelebufferului+ glGenBuffers(1,​ &​VBO_ID);​ // ​l'​identifiant de tampon ​(nomest généré
 </​code>​ </​code>​
  
 <​note>​ <​note>​
-Așa cum se poate vedea și din explicația ​API-uluifuncț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-urilegenerate.\\  +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éedans 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 bufferuluiAcest 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 tamponCe symbole peut avoir plusieurs valeurs, mais dans le laboratoire il suffit pour la spécification présentéePlus 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 soumiseQuand une nouvelle commande est soumisesi vous cliquez sur son nom, vous serez redirigé vers la page de manuel de cette commande.\\  
-De asemeneadocumentaț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 outrela 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 objectreprezintă ​un container în care stocăm indicii vertecșilorCum **VBO** si **IBO** ​sunt buffereele sunt extrem de similare în construcțieîncărcare de date și ștergere.+Un index buffer object (objet tampon d’indexest un conteneur dans lequel nous stockons des sommetsComme **VBO** si **IBO** ​sont des tamponsils sont extrêmement similaires dans leur constructionleur 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 connexionmais cette fois, le point de connexion est **GL_ELEMENT_ARRAY_BUFFER**. ​Les données sont envoyées au tampon mappé à ce point de liaisonDans 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 desenatePutem folosi ​un număr mare de buffere pentru a stoca fiecare din diferitele atribute ​(„separate buffers”). ​Putem stoca mai multe (sau toateatribute î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 randatePentru 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éeNous pouvons utiliser ​un grand nombre ​de tampons pour stocker chacun des différents attributs ​(„separate buffers”). ​Nous pouvons stocker plusieurs attributs ​(ou tousdans 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éesPour 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 curentdeoarece 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 actuelcar 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ângaspatedreaptajossus +  * **W, A, S, D, Q, E** - avantgauchearrièredroitebashaut 
-  * **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 cubvectorii ​de vertecși și indecși din inițializare. ''​VertexFormat'' ​este o structură pentru vertex cu parametrii ​(pozițieculoare). +  - Complétez la géométrie et la topologie d'un cubeles sommets et les vecteurs d'​index ​de l'​initialisation. ''​VertexFormat'' ​est une structure de sommet avec paramètres ​(positioncouleur). 
-  - 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 simpletelle 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 triunghiuri astfel încât fiecare triunghi să fie vizibil doar dintr-o parte +  - Créez ​un carré composé de 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>​
egc/laboratoare/fr/02.1570630975.txt.gz · Last modified: 2019/10/09 17:22 by alexandru.gradinaru
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0