This shows you the differences between two versions of the page.
egc:laboratoare:06 [2017/11/01 23:44] florin_eugen.iancu [Banda Grafica] |
egc:laboratoare:06 [2021/11/19 13:08] (current) victor.asavei [Cerinte laborator] |
||
---|---|---|---|
Line 1: | Line 1: | ||
===== Laboratorul 06 ===== | ===== Laboratorul 06 ===== | ||
+ | **Video Laborator 6**: https://youtu.be/f7q2TGCRly0 \\ | ||
+ | **Autor**: [[maria_anca.balutoiu@upb.ro | Anca Băluțoiu]] | ||
==== Banda Grafica ==== | ==== Banda Grafica ==== | ||
Line 54: | Line 56: | ||
</code> | </code> | ||
- | Un __**FRAGMENT SHADER**__ e un program ce este executat pentru __**FIECARE**__ fragment generat de rasterizator. Fragment shader are o functie numita main. Un exemplu de fragment shader: | + | Un __**FRAGMENT SHADER**__ e un program ce este executat pentru __**FIECARE**__ fragment generat in urma operatiei de rasterizare ([[https://graphicdesign.stackexchange.com/q/260|ce inseamna?]]). Fragment shader are in mod obligatoriu o functie numita main. Un exemplu de fragment shader: |
<code glsl> | <code glsl> | ||
Line 81: | Line 83: | ||
Prima comanda seteaza pipe-ul cu numarul 2 ca fiind utilizat. | Prima comanda seteaza pipe-ul cu numarul 2 ca fiind utilizat. | ||
A doua comanda descrie structura datelor in cadrul VBO-ului astfel: | A doua comanda descrie structura datelor in cadrul VBO-ului astfel: | ||
- | * pe pipe-ul **2** se primesc 3 float-uri (argument 3) pe care nu le normalizam (argument 4) | + | * pe pipe-ul **2** se trimit la shader 3 float-uri (argument 3) pe care nu le normalizam (argument 4) |
- | * argumentul 5 numit si **stride**, identifica pasul de citire (in bytes) in cadrul VBO-ului pentru a obtine urmatorul atribut | + | * argumentul 5 numit si **stride**, identifica pasul de citire (in bytes) in cadrul VBO-ului pentru a obtine urmatorul atribut; cu alte cuvinte, din cati in cati octeti sarim cand vrem sa gasim un nou grup de cate 3 float-uri care reprezinta acelasi lucru |
- | * argumentul 6 identifica offsetul inital din cadrul buffer-ul legat la GL_ARRAY_BUFFER (VBO) | + | * argumentul 6 identifica offsetul inital din cadrul buffer-ul legat la GL_ARRAY_BUFFER (VBO); cu alte cuvinte, de unde plecam prima oara. |
In __Vertex Shader__ vom primi atributul respectiv pe pipe-ul cu indexul specificat la legare, astfel: | In __Vertex Shader__ vom primi atributul respectiv pe pipe-ul cu indexul specificat la legare, astfel: | ||
Line 99: | Line 101: | ||
</note> | </note> | ||
+ | <note tip> Un articol despre istoria complicata a OpenGL si competitia cu Direct3D/DirectX poate fi citit [[https://softwareengineering.stackexchange.com/q/60544|aici]]. | ||
+ | </note> | ||
==== Cum trimitem date generale la un shader? ==== | ==== Cum trimitem date generale la un shader? ==== | ||
Line 105: | Line 109: | ||
<code cpp> | <code cpp> | ||
- | int location = glGetUniformLocation(int shader_program, "uniform_variable_name_in_shader")** | + | int location = glGetUniformLocation(int shader_program, "uniform_variable_name_in_shader"); |
</code> | </code> | ||
* **shader_program** reprezinta ID-ul programului shader compilat pe placa video | * **shader_program** reprezinta ID-ul programului shader compilat pe placa video | ||
- | * in cadrul framework-ului de laborator ID-ul se poate obtine apeland functia ''shader->GetProgramID()'' sau direct accesand vriabila membru ''shader->program'' | + | * in cadrul framework-ului de laborator ID-ul se poate obtine apeland functia ''shader->GetProgramID()'' sau direct accesand variabila membru ''shader->program'' |
Line 192: | Line 196: | ||
</note> | </note> | ||
- | - Descarcati [[https://github.com/UPB-Graphics/Framework-EGC/archive/master.zip|framework-ul de laborator]] | + | - Descarcati [[https://github.com/UPB-Graphics/gfx-framework/archive/master.zip|framework-ul de laborator]] |
- Completati functia ''RenderSimpleMesh'' astfel inca sa trimiteti corect valorile uniform catre Shader | - Completati functia ''RenderSimpleMesh'' astfel inca sa trimiteti corect valorile uniform catre Shader | ||
* Se interogeaza locatia uniformelor "Model", "View" si "Projection" | * Se interogeaza locatia uniformelor "Model", "View" si "Projection" | ||
* Folosind ''glUniformMatrix4fv'' sa se trimita matricile corespunzatoare catre shader | * Folosind ''glUniformMatrix4fv'' sa se trimita matricile corespunzatoare catre shader | ||
- | * Daca ati completat corect functia ar trebui sa vedeti un cub pe centrul ecranului rottit 45 grade in jurul lui Y si colorat variat | + | * 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 |
- Completati Vertex Shaderul | - Completati Vertex Shaderul | ||
- | * Se declara atributele de intrare pentru ''Vertex Shader'' folosind layout location <code glsl> | + | - Se declara atributele de intrare pentru ''Vertex Shader'' folosind layout location <code glsl> |
layout(location = 0) in vec3 v_position; | layout(location = 0) in vec3 v_position; | ||
- | // same for the rest of the attributes | + | // same for the rest of the attributes ( check Lab6.cpp CreateMesh() ); |
</code> | </code> | ||
- | * Se declara atributele de iesire catre ''Fragment Shader'' <code glsl> | + | - Se declara atributele de iesire catre ''Fragment Shader'' <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> | + | - Se salveza valorile de iesire in ''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> | + | - Se calculeaza pozitia in clip space a vertexului primit folosind matricile Model, View, 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> | ||
Line 221: | Line 226: | ||
out_color = vec4(frag_color, 1); | out_color = vec4(frag_color, 1); | ||
</code> | </code> | ||
- | - Sa se primeasca toate atributele trimise de catre vertex shader conform locatiilor utilizate in functia ''Laborator6::CreateMesh'' | ||
- Sa se utilizeze normala vertexilor pe post de culoare de output in cadrul Fragment Shader-ului | - Sa se utilizeze normala vertexilor pe post de culoare de output in cadrul Fragment Shader-ului | ||
* Inspectati de asemenea structura ''VertexFormat'' pentru a intelege ceea ce se trimite pe fiecare pipe | * Inspectati de asemenea structura ''VertexFormat'' pentru a intelege ceea ce se trimite pe fiecare pipe | ||
- Sa se interschimbe **pipe-ul 1** cu **pipe-ul 3**. Trimiteti normala pe **pipe-ul 3** si culoarea vertexului pe **pipe-ul 1** | - Sa se interschimbe **pipe-ul 1** cu **pipe-ul 3**. Trimiteti normala pe **pipe-ul 3** si culoarea vertexului pe **pipe-ul 1** | ||
* Se inspecteaza rezultatul obtinut | * Se inspecteaza rezultatul obtinut | ||
+ | - 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.) | ||
<hidden> | <hidden> | ||
+ | - Sa se primeasca toate atributele trimise de catre vertex shader conform locatiilor utilizate in functia ''Laborator6::CreateMesh'' | ||
**[Bonusuri posibile]** | **[Bonusuri posibile]** | ||
* displacement in vertex shader | * displacement in vertex shader |