This shows you the differences between two versions of the page.
egc:laboratoare:fr:06 [2019/11/14 07:21] alexandru.gradinaru created |
egc:laboratoare:fr:06 [2019/11/14 07:33] (current) alexandru.gradinaru |
||
---|---|---|---|
Line 7: | Line 7: | ||
En utilisant OpenGL sont transmises au GPU : les coordonnées des pics, les matrices de transformation des pics (M: modélisation, V: visualisation, P: projection, MV: modélisation-visualisation, MVP: modélisation-visualisation-projection), la topologie des primitives, textures et données . | En utilisant OpenGL sont transmises au GPU : les coordonnées des pics, les matrices de transformation des pics (M: modélisation, V: visualisation, P: projection, MV: modélisation-visualisation, MVP: modélisation-visualisation-projection), la topologie des primitives, textures et données . | ||
- | {{ :egc:laboratoare:banda_grafica.png?nolink&500 |}} | + | <hidden>{{ :egc:laboratoare:banda_grafica.png?nolink&500 |}}</hidden> |
+ | {{ :egc:laboratoare:fr:annotation_2019-11-14_094838.png?nolink&500 |}} | ||
1. Dans l’étape programmable, VERTEX SHADER transforme les coordonnées d’un pic à l’aide de la matrice MVP, en passant de coordonnées d’objet à coordonnées de coupe (coordonnées angulaires du clip ). En outre, des calculs d'éclairage au niveau de pointe peuvent être effectués. Le programme VERTEX SHADER est exécuté en parallèle pour un très grand nombre de pics. | 1. Dans l’étape programmable, VERTEX SHADER transforme les coordonnées d’un pic à l’aide de la matrice MVP, en passant de coordonnées d’objet à coordonnées de coupe (coordonnées angulaires du clip ). En outre, des calculs d'éclairage au niveau de pointe peuvent être effectués. Le programme VERTEX SHADER est exécuté en parallèle pour un très grand nombre de pics. | ||
Line 131: | Line 132: | ||
</code> | </code> | ||
- | Functiile **glUniform** sunt de forma **glUniform[Matrix?]NT[v?]** (regex) unde: | + | Les fonctions glUniform ont la forme **glUniform[Matrix?]NT[v?]** (regex) où: |
- | * Matrix - in cazul in care e prezent identifica o matrice | + | * Matrix - si présent identifie un tableau |
- | * N - reprezinta numarul de variabile de tipul **T** ce vor fi trimise: | + | * N - représente le nombre de variables de type T à envoyer: |
- | * **1, 2, 3, 4** in cazul tipurilor simple | + | * **1, 2, 3, 4** pour les types simples |
- | * pentru matrici mai exista si **2x3, 2x4, 3x2, 3x4, 4x2, 4x3** | + | * pour les matrices il y a aussi **2x3, 2x4, 3x2, 3x4, 4x2, 4x3** |
- | * T - reprezinta tipul variabilelor trimise | + | * T - représente le type de variables envoyées |
* **ui** - unsigned int | * **ui** - unsigned int | ||
* **i** - int | * **i** - int | ||
* **f** - float | * **f** - float | ||
- | * v - datele sunt specificate printr-un vector, se da adresa de memorie a primei valori din vector | + | * v - les données sont spécifiées par un vecteur, l'adresse mémoire de la première valeur du vecteur est donnée |
- | ===== Comunicarea intre shadere-le OpenGL ====== | + | ===== Communication entre shaders OpenGL ====== |
- | In general pipeline-ul programat este alcatuit din mai multe programe shader. In cadrul cursului de EGC vom utiliza doar __Vertex Shader__ si __Fragment Shader__. OpenGL ofera posibilitatea de a comunica date intre programele shader consecutive prin intermendiul atributelor **in** si **out** | + | n général, le pipeline planifié se compose de plusieurs programmes de shader. Dans le cours EGC, nous utiliserons uniquement Vertex Shader et Fragment Shader . OpenGL offre la possibilité de communiquer des données entre des programmes de shader consécutifs via les attributs in et out. |
<note important> | <note important> | ||
- | In metoda specifica OpenGL 3.3 numele de atribut **attribute_name** trebuie sa fie acelasi atat in __Vertex Shader__ cat si in __Fragment Shader__ pentru a se stie legatura intre input/output. | + | OpenGL 3.3 attribut nom de méthode spécifique ATTRIBUTE_NAME doit être identique à la fois Vertex Shader et le fragment shader pour connaître la connexion entre l' entrée / sortie. |
</note> | </note> | ||
Line 164: | Line 165: | ||
<note important> | <note important> | ||
- | In caz ca avem support pentru GLSL 410 (OpenGL 4.1) se poate specifica si locatia attributului astfel, caz in care doar locatiile vor fi folosite pentru a lega iesirea unui __Vertex Shader__ de intrarea la __Fragment Shader__ si nu numele atributului. \\ | + | Si GLSL 410 (OpenGL 4.1) est pris en charge, l'emplacement de l'attribut peut également être spécifié. Dans ce cas, seuls les emplacements seront utilisés pour lier la sortie d'un Vertex Shader à l'entrée Fragment Shader et non le nom de l'attribut. |
- | Mai multe detalii se pot obtine de la: [[https://www.opengl.org/wiki/Layout_Qualifier_(GLSL)#Program_separation_linkage | Program separation linkage ]] | + | Plus de détails peuvent être obtenus auprès de:[[https://www.opengl.org/wiki/Layout_Qualifier_(GLSL)#Program_separation_linkage | Program separation linkage ]] |
</note> | </note> | ||
Line 184: | Line 185: | ||
- | ==== Cerinte laborator ==== | + | ==== Exercices ==== |
<note tip> | <note tip> | ||
- | tasta **F5** - reincarca shaderele in timpul rularii aplicatiei. Nu este nevoie sa opriti aplicatia intrucat shaderele sunt __compilate si rulate de catre placa video__ si nu au legatura cu codul sursa C++ propriu zis. | + | Touche F5 - recharge le shader lors de l'exécution de l'application. Il n'est pas nécessaire d'arrêter l'application car les shader sont compilés et exécutés par la carte vidéo et ne sont pas liés au code source C ++ lui-même. |
</note> | </note> | ||
- | - Descarcati [[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 framework de laboratoire]] |
- | - Completati functia ''RenderSimpleMesh'' astfel inca sa trimiteti corect valorile uniform catre Shader | + | - Completez la fonction ''RenderSimpleMesh'' pour que les valeurs soient correctement envoyées à Shader |
- | * Se interogeaza locatia uniformelor "Model", "View" si "Projection" | + | * L'emplacement des uniformes "Modèle", "Vue" et "Projection" est interrogé |
- | * Folosind ''glUniformMatrix4fv'' sa se trimita matricile corespunzatoare catre shader | + | * Utilisation ''glUniformMatrix4fv'' des tableaux appropriés à envoyer au shader |
- | * Daca ati completat corect functia, si ati completat gl_Position in vertex shader, ar trebui sa vedeti un cub pe centrul ecranului rottit 45 grade in jurul lui Y si colorat variat | + | * Si vous avez terminé la fonction correctement et que vous avez terminé gl_Position dans le vertex shader, un cube au centre de l'écran pivoté à 45 degrés autour de Y et de couleur différente |
- | - Completati Vertex Shaderul | + | - Completez le Vertex Shader |
- | - Se de clara atributele de intrare pentru ''Vertex Shader'' folosind layout location <code glsl> | + | - Il efface les attributs d'entrée pour Vertex Shader utiliser l'emplacement de la disposition <code glsl> |
layout(location = 0) in vec3 v_position; | layout(location = 0) in vec3 v_position; | ||
// same for the rest of the attributes ( check Lab6.cpp CreateMesh() ); | // same for the rest of the attributes ( check Lab6.cpp CreateMesh() ); | ||
</code> | </code> | ||
- | - Se declara atributele de iesire catre ''Fragment Shader'' <code glsl> | + | - Les attributs de sortie à Fragment Shader sont déclarés <code glsl> |
out vec3 frag_color; | out vec3 frag_color; | ||
// same for other attributes | // same for other attributes | ||
</code> | </code> | ||
- | - Se salveza valorile de iesire in ''main()'' <code glsl> | + | - Les valeurs de sortie sont enregistrées dans ''main()'' <code glsl> |
frag_color = vertex_color; | frag_color = vertex_color; | ||
// same for other attributes | // same for other attributes | ||
</code> | </code> | ||
- | - Se calculeaza pozitia in clip space a vertexului primit folosind matricile Model, View, Projection <code glsl> | + | - La position dans le clip reçu du sommet reçu est calculée à l'aide des matrices Modèle, Vue, Projection. <code glsl> |
gl_Position = Projection * View * Model * vec4(v_position, 1.0); | gl_Position = Projection * View * Model * vec4(v_position, 1.0); | ||
</code> | </code> | ||
- | - Completati Fragment Shaderul | + | - Copmletez le fragment Shaderul |
- | * Se primesc valorile atributelor trimise de la ''Vertex Shader'' | + | * Les valeurs des attributs envoyés de ''Vertex Shader'' |
- | * Valoarea de intrare ale fiecarui atribut e calculata prin interpolare liniara intre vertexii ce formeaza patch-ul definit la desenare (triunghi, linie) <code glsl> | + | * La valeur d'entrée de chaque attribut est calculée par interpolation linéaire entre les sommets formant le patch défini au dessin (triangle, ligne). <code glsl> |
in vec3 frag_color; | in vec3 frag_color; | ||
</code> | </code> | ||
- | * Se calculeaza valoarea fragmentului (pixelului) de output <code glsl> | + | * La valeur du fragment de sortie (pixel) est calculée <code glsl> |
out_color = vec4(frag_color, 1); | out_color = vec4(frag_color, 1); | ||
</code> | </code> | ||
- | - Sa se utilizeze normala vertexilor pe post de culoare de output in cadrul Fragment Shader-ului | + | - Pour utiliser le sommet normal en tant que couleur de sortie dans le Fragment Shader |
- | * Inspectati de asemenea structura ''VertexFormat'' pentru a intelege ceea ce se trimite pe fiecare pipe | + | * Inspectez également la structure VertexFormatpour comprendre ce qui est envoyé sur chaque pipe. |
- | - Sa se interschimbe **pipe-ul 1** cu **pipe-ul 3**. Trimiteti normala pe **pipe-ul 3** si culoarea vertexului pe **pipe-ul 1** | + | - Échangez le pipe 1 avec le pipe 3 . Envoi normal sur le pipe 3 et couleur de sommet sur le pipe 1 |
- | * Se inspecteaza rezultatul obtinut | + | * Le résultat obtenu est inspecté |
- | - Bonus: sa se trimita timpul aplicatiei (Engine::GetElapsedTime()), si sa se varieze pozitia si culoarea (unul sau mai multe canale de culoare) dupa o functie de timp (trigonometrica etc.) | + | - Bonus: envoyez le temps d'application (Engine :: GetElapsedTime ()), et changez la position et la couleur (un ou plusieurs canaux de couleur) après une fonction de temps (trigonométrique, etc.) |
<hidden> | <hidden> |