This shows you the differences between two versions of the page.
|
egc:laboratoare:06 [2017/11/01 23:49] florin_eugen.iancu [Shader OpenGL] |
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 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 | ||