Differences

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

Link to this comparison view

pgapi:laboratoare:02 [2024/10/08 16:41]
andrei.lambru
pgapi:laboratoare:02 [2024/10/09 10:05] (current)
andrei.lambru [Cerințe laborator]
Line 1: Line 1:
 ====== Laboratorul 02 ====== ====== Laboratorul 02 ======
- 
-<​hidden>​ 
-===== Suprafețe generate ===== 
- 
-În multe cazuri, putem cunoaște propietățile unei suprafețe fără a-i cunoaște geometria explicită. Putem genera această suprafață folosind o geometrie generatoare și un proces de generare. În acest laborator, vom explora câteva din metodele de generare existente. 
- 
-Orice suprafață generată are: 
-  * Un generator, adică o geometrie explicit definită pe baza căreia are loc procesul de generare 
-  * Un algoritm de generare. Acesta poate fi bazat pe rotație, translație sau pe orice fel de curbă definită prin puncte de control (ex: Bezier, Hermite, etc) 
- 
-Procesul de generare decurge astfel: întâi se desenează geometria generator, pe baza căreia va fi construită suprafața generată. După aceasta, se desenează un număr de instanțe ale geometriei generator, fiecare transformată de funcția de generare într-un mod progresiv. Rezultatul final este obținut prin combinarea topologică a acestor instanțe. 
- 
-===== Diferite tipuri de instanțiere ===== 
- 
-Instanțierea reprezintă un mecanism prin care se amplifică numărul de primitive trimise la banda grafică. Această amplificare este fie explicită (programată de utilizator în shader), fie implicită (generată prin comenzi OpenGL). 
- 
-Pentru a instanția implict geometrie, există comanda: 
- 
-<code cpp> 
-glDrawElementsInstanced(topologie,​ nr_indecsi, tip_data, offset, instante). 
-</​code>​ 
- 
-De exemplu, dacă aș dori să desenez de 15 ori (instanțe) un obiect cu 99 de indecși, format din triunghiuri din buffer-ul de indecși, legat curent la banda grafică, atunci comanda ar fi: 
- 
-<code cpp> 
-glDrawElementsInstanced(GL_TRIANGLES,​ 99, GL_UNSIGNED_INT,​ 0, 15); 
-</​code>​ 
- 
-Instanțierea explicită se face în shader, generând geometrie nouă prin comenzi glsl, în acest caz prin comenzi de geometry shader: 
-<code glsl> 
-for (int index = 0; index < 15; index++) { 
-      gl_Position = P*V*M*vec4(p1,​ 1);​ EmitVertex();​ 
-      gl_Position = P*V*M*vec4(p2,​ 1);​ EmitVertex();​ 
-      gl_Position = P*V*M*vec4(p3,​ 1);​ EmitVertex();​ 
-      EndPrimitive();​ 
-} 
-</​code>​ 
-Instanțirea oferă posibilitatea ușoară de a crește rapid numărul de obiecte din scenă, dacă obiectele sunt identice. Ex: copaci, tile-uri de teren, unități într-un rts, etc. 
- 
-Pentru a lucra cu suprafețe de translație,​ rotație și/sau interpolare,​ vom folosi instanțiere. Totuși, chiar dacă avem N instanțe de geometrie generator, nu avem topologia necesară pentru a lega instanțele,​ deoarece generatorul este o curbă (topologie 2D), iar suprafața generată necesită topologie 3D. 
- 
-{{ :​pgapi:​laboratoare:​poza_suprafete.png?​nolink |}} 
- 
-Din figură se observă clar cum avem mai multe tipuri de obiecte: 
-  - Obiectul generator (prima linie neagră din stânga) 
-  - Obiectul nou generat (2 instanțe ale generatorului și topologie de legatură între linii) 
-  - Suprafața finală generată 
- 
-Dacă nu am fi folosit acest proces, atunci prin instanțiere am fi obținut liniile instanțiate,​ dar nu și topologia de legatură între linii, adică exact ca în următoarea imagine: 
- 
-{{ :​pgapi:​laboratoare:​poza_curbe.png?​nolink |}} 
-</​hidden>​ 
- 
 ===== Suprafețe generate ===== ===== Suprafețe generate =====
  
Line 92: Line 39:
 </​code>​ </​code>​
  
-Instanțierea explicită se face în shader, generând geometrie nouă prin comenzi ​glsl, în acest caz prin comenzi de geometry shader:+Instanțierea explicită se face în shader, generând geometrie nouă prin comenzi ​GLSL, în acest caz prin comenzi de geometry shader:
 <code glsl> <code glsl>
 for (int i=0;​i<​10;​i++) { for (int i=0;​i<​10;​i++) {
Line 104: Line 51:
  
 În situația în care se utilizează instanțiere implicită, în programul de tip vertex shader, se poate obține numărul de ordine al instanței din care face parte vârful procesat, prin utilizarea atributului de intrare implicit ''​gl_InstanceID''​. În situația în care se utilizează instanțiere implicită, în programul de tip vertex shader, se poate obține numărul de ordine al instanței din care face parte vârful procesat, prin utilizarea atributului de intrare implicit ''​gl_InstanceID''​.
 +
 +<note important>​
 +În cadrul acestui laborator, se utilizează numărul de ordine al instanței din care face parte linia primită la intrare de către programul de tip geometry shader. Implicit, standardul OpenGL nu permite accesul la atributul de intrare ''​gl_InstanceID''​ în geometry shader. Din acest motiv, a fost creat un atribut de ieșire din vertex shader cu numele ''​instance''​ ce este primit sub forma de atribut de intrare în geometry shader cu tipul de date vector de 2 componente ''​instance[2]'',​ conform codului GLSL de mai jos:
 +
 +<code glsl>
 +// Vertex Shader
 +...
 +out int instance;
 +
 +void main()
 +{
 +    instance = gl_InstanceID;​
 +    ...
 +}
 +</​code>​
 +
 +<code glsl>
 +// Geometry Shader
 +in int instance[2];​
 +...
 +</​code>​
 +
 +Ambele valori ale vectorului sunt identice și reprezintă numărul de ordine al instanței din care face parte linia de la intrarea programului de tip geometry shader.
 +</​note>​
  
 Instanțirea oferă posibilitatea ușoară de a crește rapid numărul de obiecte din scenă, dacă obiectele sunt identice. Ex: copaci, tile-uri de teren, unități într-un rts, etc. Instanțirea oferă posibilitatea ușoară de a crește rapid numărul de obiecte din scenă, dacă obiectele sunt identice. Ex: copaci, tile-uri de teren, unități într-un rts, etc.
Line 127: Line 98:
  
 <note important>​ <note important>​
 +  * //Geometria suport trimisă către shader este o linie, ce leagă primul și ultimul punct de control.// Punctele de control sunt accesabile în geometry shader sub numele ''​control_p1'',​ ''​control_p2'',​ ''​control_p3'',​ ''​control_p4''​. ​
   * În laborator, geometria suport pentru curbă este deja definită. Există două tipuri de instanțieri:​   * În laborator, geometria suport pentru curbă este deja definită. Există două tipuri de instanțieri:​
       * Instanțierea implicită, facută cu comanda glDrawElementsInstanced,​ care este deja implementată și care generează geometria suport de N ori       * Instanțierea implicită, facută cu comanda glDrawElementsInstanced,​ care este deja implementată și care generează geometria suport de N ori
       * Instanțierea explicită, care va fi implementată în geometry shader.       * Instanțierea explicită, care va fi implementată în geometry shader.
-  * //Geometria suport trimisă către shader este o linie, ce leagă primul și ultimul punct de control.// Punctele de control sunt accesabile în geometry shader sub numele ''​control_p1'',​ ''​control_p2'',​ ''​control_p3'',​ ''​control_p4''​. ​ 
 </​note>​ </​note>​
  
pgapi/laboratoare/02.1728394876.txt.gz · Last modified: 2024/10/08 16:41 by andrei.lambru
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