Differences

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

Link to this comparison view

ppbg:laboratoare:08 [2023/12/06 19:52]
andrei.lambru
— (current)
Line 1: Line 1:
-====== Laboratorul 08 ====== 
- 
-<note tip> 
-**Reamintire!!!** Puteți prezenta rezolvările cerințelor de până la 2 laboratoare,​ în fiecare săptămână. De exemplu, puteți prezenta laboratorul curent și pe cel din săptămâna anterioară,​ în totalitate sau parțial, inclusiv punctajul pentru cerința bonus :) . 
-</​note>​ 
- 
-<note tip> 
-Pentru rezolvarea cerințelor din cadrul acestui labroator: 
-  - [[https://​github.com/​UPB-Graphics/​gfx-framework-ppbg | Descărcați]] framwork-ul de laborator și copiați, din arhiva descărcată,​ directorul **Lab8**, în interiorul directorului //​gfx-framework-ppbg\src\lab//​ din versiunea voastră de proiect. 
-  - Adăugați în fișierul ''​lab_list.h'',​ linia ''#​include "​lab/​lab8/​lab8.h"''​. 
-  - Folosiți din nou utilitarul CMake pentru a regenera proiectul. Pentru a vă reaminti procesul de realizare a setup-ului, puteți să reconsultați [[:​ppbg:​setup-framework | pagina]] dedicată acestui lucru. 
-</​note>​ 
- 
-===== Programe de tip shader pentru prelucrarea topologiei ===== 
- 
-<​hidden>​ 
-Un __**GEOMETRY SHADER**__ e un program care se execută pentru __**FIECARE**__ primitivă trimisă către banda grafică. Pe scurt, acest shader primește ca intrare primitive grafice (puncte, linii și triunghiuri) și oferă ca ieșire tot primitive grafice. În banda grafică, așa cum se poate vedea în imaginea de mai sus, se află între **Vertex Shader** și **Fragment Shader**. Mai exact, ieșirea de la vertex shader devine intrare pentru geometry shader și ieșirea de la acesta devine intrare pentru fragment shader (după alți câțiva pași ficși). 
-</​hidden>​ 
- 
-În continuare vom analiza un geometry shader simplu, precum și comunicarea dintre vertex shader și geometry shader: 
- 
-  * Un exemplu de vertex shader: <code glsl> 
-#version 330 
-  
-layout(location = 0) in vec3 v_position; 
-layout(location = 1) in vec2 v_texcoord; 
- 
-uniform mat4 Model; 
-uniform mat4 View; 
-uniform mat4 Projection; 
- 
-//​coordonatele textură ale vârfului 
-//ieșirea lui vertex shader este intrare pentru geometry shader 
-out vec2 vert_texcoord;​ 
- 
-  
-void main() 
-{ 
-    gl_Position = Projection * View * Model * vec4(v_position,​ 1.0); 
-    ​ 
-    vert_texcoord = v_texcoord; 
-} 
-</​code>​ 
- 
-  * Un exemplu de geometry shader: <code glsl> 
-#version 330 
- 
-//intrarea este un triunghi 
-layout(triangles) in; 
- 
-//ieșirea este un triangle strip. Se vor genera maxim 4 vârfuri 
-layout(triangle_strip,​ max_vertices = 4) out; 
- 
-//intrarea - coordonatele textură ale vârfurilor unui triunghi 
-layout(location = 0) in vec2 vert_texcoord[3];​ 
- 
-//​coordonatele textură asociate fiecărui vârf emis 
-layout(location = 0) out vec2 geom_texcoord;​ 
- 
-void main() 
-{ 
- gl_Position = gl_in[0].gl_Position;​ 
- geom_texcoord = vert_texcoord[0];​ 
- EmitVertex();​ 
- 
- gl_Position = gl_in[1].gl_Position;​ 
- geom_texcoord = vert_texcoord[1];​ 
- EmitVertex();​ 
- 
- gl_Position = gl_in[2].gl_Position;​ 
- geom_texcoord = vert_texcoord[2];​ 
- EmitVertex();​ 
- 
- EndPrimitive();​ 
-        //directiva aceasta încheie primitiva ​ 
-} 
-</​code>​ 
- 
-==== Atribute de intrare și de iesire ==== 
- 
-  * Trebuie specificat tipul geometriei de la intrare: <code glsl> 
-layout(triangles) in; 
-</​code>​ Trebuie să fie unul dintre: ''​points'',​ ''​lines'',​ ''​lines_adjacency'',​ ''​triangles'',​ ''​triangles_adjacency''​ 
- 
-  * Trebuie specificat tipul geometriei de la ieșire: <code glsl> 
-layout(triangle_strip,​ max_vertices = 5) out; 
-</​code>​ Trebuie să fie unul dintre: ''​points'',​ ''​line_strip'',​ ''​triangle_strip''​ 
- 
-  * Se primesc coordonatele de textură de la toată primitiva (triunghiul). Astfel că intrarea este un vector de 3 valori ''​vec2''​. <code glsl> 
-layout(location = 0) in vec2 vert_texcoord[3];​ 
-</​code> ​ 
-  * Nu este necesar să se dea dimensiunea vectorului. Astfel, codul de mai sus se poate scrie: <code glsl> 
-layout(location = 0) in vec2 vert_texcoord[];​ 
-</​code>​ 
- 
-  * De asemenea, există și un atribut implicit într-un program de tip geometry shader, cu numele ''​gl_in'',​ din care ne interesează ''​gl_Position'':​ <code glsl> 
-in gl_PerVertex 
-{ 
-  vec4 gl_Position;​ 
-  ... 
-} gl_in[]; 
-</​code>​ 
- 
-  * Atributele de ieșire ale unui program de tip geometry shader sunt descrise în secțiunea următoare: <code glsl> 
-layout(location = 0) out vec2 geom_texcoord;​ 
-</​code>​ 
- 
-==== Emiterea de primitive ==== 
- 
-Pentru fiecare vârf emis dintr-un program de tip geometry shader, se poate asocia informație despre coordonata de textură, vectorul normal, culoarea și orice alt tip de informație asociată vârfului (specificate înainte de fiecare apel ''​EmitVertex()''​). 
-Acestea trebuie declarate ca variabile de ieșire. 
-După cum se poate observa, valoarea lui ''​geom_texcoord''​ este actualizată înainte de fiecare apel ''​EmitVertex()'':<​code glsl> 
-gl_Position = gl_in[0].gl_Position;​ 
-geom_texcoord = vert_texcoord[0];​ 
-EmitVertex();​ 
-</​code>​ 
- 
-Într-un geometry shader se pot emite mai multe primitive (comanda ''​EmitVertex()''​ se poate da o dată sau de mai multe ori). 
  
ppbg/laboratoare/08.1701885152.txt.gz · Last modified: 2023/12/06 19:52 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