Laboratorul 01

În acest laborator vom recapitula cunoștințe de anul trecut de la EGC, aceste informații sunt esențiale pentru laboratoarele de SPG.

Tot conținutul laboratoarelor EGC se poate găsi în Laboratorul 00.

Framework laborator

Acest laborator va utiliza framework-ul de la EGC cu mici imbunatatiri si noi functionalitati pentru usurarea implementarii noilor tehnici avansate ce vor fi invatate.

Acesta se găsește pe Github
Puteți să descărcați direct arhiva accesând acest link

Pipeline-ul grafic in API-ul OpenGL

Geometry Shader

Pentru implementarea de programe SHADER in OpenGL se foloseste limbajul dedicat GLSL (GL Shading Language).

Legarea unui shader la programul care foloseste OpenGL este o operatie complicata, de aceea va este oferit codul prin care se incarca un shader.

Un GEOMETRY SHADER e un program care se executa pentru FIECARE primitiva trimisa catre banda grafica. Pe scurt, acest shader primeste ca input geometrie si ofera ca output geometrie. Geometrie se intelege aici ca una din: puncte, linii si triunghiuri. In pipeline-ul grafic, asa cum se poate vedea in imaginea de mai sus, se afla intre Vertex Shader si Fragment Shader. Mai exact, output-ul de la vertex shader devine input pentru geometry shader si output-ul de aici devine input pentru fragment shader (dupa alti cativa pasi ficsi de recostructie si modificare).

In continuare vom analiza un geometry shader simplu pentru a vedea sintaxa:

  • Un exemplu de vertex shader:
    #version 330
     
    layout(location = 0) in vec3 v_position;
    layout(location = 1) in vec3 v_texcoord;
     
    uniform mat4 Model;
    uniform mat4 View;
    uniform mat4 Projection;
     
    out vert_texcoord;
     
    void main()
    {
        gl_Position = Projection * View * Model * vec4(v_position, 1.0);
     
        vert_texcoord = v_texcoord;
    }
  • Un exemplu de geometry shader:
    #version 330
     
    layout(triangles) in;
    layout(triangle_strip, max_vertices = 3) out;
     
    layout(location = 0) in vec2 vert_texcoord[];
     
    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();
     
    }

Input si Output

  • Trebuie specificat tipul geometriei de la input:
    layout(triangles) in;

    Trebuie sa fie unul din: points, lines, lines_adjacency, triangles, triangles_adjacency

  • Trebuie specificat tipul geometriei de output
    layout(triangle_strip, max_vertices = 3) out;

    Trebuie sa fie unul din: points, line_strip, triangle_strip

  • Se primesc coordonatele de textura de la toata primitiva (triunghiul). Astfel ca inputul va fi un vector de valori vec2.
    layout(location = 0) in vec2 vert_texcoord[];

    De asemenea exista si input implicit, dar cel care ne intereseaza este:

    in gl_PerVertex
    {
      vec4 gl_Position;
      ...
    } gl_in[];
  • De asemenea exista o forma simbolica de output, care va fi descrisa in sectiunea urmatoare.
    layout(location = 0) out vec2 geom_texcoord;

Emiterea de primitive

Pentru fiecare vertex care compune primitiva noastra, trebuie sa setam valorile de output pentru vertexul modificat si apoi sa utilizam directiva EmitVertex().

gl_Position = gl_in[0].gl_Position;
geom_texcoord = vert_texcoord[0];
EmitVertex();

Cerinte laborator

Tasta F5 - reincarca shaderele in timpul rularii aplicatiei. Nu este nevoie sa opriti aplicatia intrucat shaderele sunt compilate si rulate de catre procesorul grafic si nu au legatura cu codul sursa C++ propriu zis.

  1. Aplicati textura pe obiect
  2. Creati mai multe instante ale obiectului in geometry shader
  3. Aplicati un proces de shrinking parametrizat asupra triunghiurilor obiectului
spg/laboratoare/01.txt · Last modified: 2019/09/29 21:26 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