This shows you the differences between two versions of the page.
egc:laboratoare:02 [2021/10/18 13:17] victor.asavei [Topologie] |
egc:laboratoare:02 [2023/10/18 19:11] (current) mihnea.mitrache [Face Culling] |
||
---|---|---|---|
Line 90: | Line 90: | ||
glCullFace(GL_BACK); | glCullFace(GL_BACK); | ||
</code> | </code> | ||
+ | |||
+ | <note> În concluzie, atunci când ne propunem să definim geometria unui | ||
+ | obiect este foarte importantă ordinea specificării indicilor. | ||
+ | </note> | ||
+ | |||
+ | <note tip> Pentru o definire corectă se pot urma pașii: | ||
+ | - Ne fixăm privirea pe o anumită axa. | ||
+ | - Identificăm fețele vizibile și cele nevizibile. | ||
+ | - Triunghiurile care alcătuiesc fețele vizibile se specifică în ordine trigonometrică iar cele nevizibile în ordinea inversă. | ||
+ | </note> | ||
+ | |||
+ | {{ :egc:laboratoare:lab02:cull_face.png?750 |}} | ||
+ | |||
+ | <note warning>Dacă vă întrebați de ce după ce ați activat CULL_FACE obiectele voastre nu arată | ||
+ | corect, cel mai probabil ați fost inconsecvenți în ceea ce privește ordinea de specificare a | ||
+ | indicilor. | ||
+ | </note> | ||
===== Meshe ===== | ===== Meshe ===== | ||
- | Un „mesh” este un obiect tridimensional definit prin vârfuri și indici. În laborator aveți posibilitatea să încărcați meshe în aproape orice format posibil prin intermediul clasei [[https://github.com/UPB-Graphics/Framework-EGC/blob/master/Source/Core/GPU/Mesh.h#L67|Mesh]]. | + | Un „mesh” este un obiect tridimensional definit prin vârfuri și indici. În laborator aveți posibilitatea să încărcați meshe în aproape orice format posibil prin intermediul clasei [[https://github.com/UPB-Graphics/gfx-framework/blob/master/src/core/gpu/mesh.h#L48|Mesh]]. |
Line 138: | Line 155: | ||
<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.\\ | + | Pentru a înțelege mai bine API-ul OpenGL vă recomandă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.\\ |
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]]** | 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]]** | ||
</note> | </note> | ||
Line 185: | Line 202: | ||
În cadrul laboratorului vom învăța să folosim **VAO, VBO, IBO** și astfel să generăm și încărcăm geometrie simplă.\\ | În cadrul laboratorului vom învăța să folosim **VAO, VBO, IBO** și astfel să generăm și încărcăm geometrie simplă.\\ | ||
- | 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. | + | Laboratorul pune la dispoziție structura [[https://github.com/UPB-Graphics/gfx-framework/blob/master/src/core/gpu/vertex_format.h|VertexFormat]] ce va fi utilizată ca bază pentru a crea geometria. |
<code cpp> | <code cpp> | ||
Line 209: | Line 226: | ||
// Initializes the mesh object using a VAO GPU buffer that contains the specified number of indices | // Initializes the mesh object using a VAO GPU buffer that contains the specified number of indices | ||
- | bool InitFromBuffer(unsigned int VAO, unsigned short nrIndices); | + | bool InitFromBuffer(unsigned int VAO, unsigned int nrIndices); |
// Initializes the mesh object and upload data to GPU using the provided data buffers | // Initializes the mesh object and upload data to GPU using the provided data buffers | ||
- | bool InitFromData(std::vector<VertexFormat> vertices, | + | bool InitFromData(const std::vector<VertexFormat>& vertices, |
- | std::vector<unsigned short>& indices); | + | const std::vector<unsigned int>& indices); |
// Initializes the mesh object and upload data to GPU using the provided data buffers | // Initializes the mesh object and upload data to GPU using the provided data buffers | ||
- | bool InitFromData(std::vector<glm::vec3>& positions, | + | bool InitFromData(const std::vector<glm::vec3>& positions, |
- | std::vector<glm::vec3>& normals, | + | const std::vector<glm::vec3>& normals, |
- | std::vector<unsigned short>& indices); | + | const std::vector<unsigned int>& indices); |
</code> | </code> | ||
<note tip> | <note tip> | ||
Line 233: | Line 250: | ||
<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. | + | Toate cerințele ce țin de încărcare de geometrie trebuie rezolvate prin intermediul funcției ''Lab2::CreateMesh'' dar puteți folosi metodele ''Mesh::InitFromData()'' pentru a verifica validitatea geometriei. |
</note> | </note> | ||
- | - Descărcați [[https://github.com/UPB-Graphics/Framework-EGC/archive/master.zip|framework-ul de laborator]] | + | - Descărcați [[https://github.com/UPB-Graphics/gfx-framework/archive/master.zip|framework-ul de laborator]] |
- 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). | - 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). | ||
- | - Completați funcția ''Laborator2::CreateMesh'' astfel încât să încărcați geometria pe GPU | + | - Completați funcția ''Lab2::CreateMesh'' astfel încât să încărcați geometria pe GPU |
* creați un VAO | * creați un VAO | ||
* creați un VBO și adăugați date în el | * creați un VBO și adăugați date în el | ||
* creați un IBO și adăugați date în el | * creați un IBO și adăugați date în el | ||
- | * afișați noul obiect (RenderMesh[cube3]) astfel încât să nu se suprapună cu un alt obiect | + | * afișați noul obiect (RenderMesh[cube_B]) astfel încât să nu se suprapună cu un alt obiect |
- Creați o nouă formă geometrică simplă, de exemplu un tetraedru și desenați-l în scenă | - Creați o nouă formă geometrică simplă, de exemplu un tetraedru și desenați-l în scenă | ||
- Atunci când se apasă tasta **F2** faceți toggle între modul de culling **GL_BACK** și **GL_FRONT** | - Atunci când se apasă tasta **F2** faceți toggle între modul de culling **GL_BACK** și **GL_FRONT** |