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 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 intrare primitive grafice (puncte, linii si triunghiuri) si ofera ca iesire tot primitive grafice. In banda grafica, asa cum se poate vedea in imaginea de mai sus, se afla intre Vertex Shader si Fragment Shader. Mai exact, iesirea de la vertex shader devine intrare pentru geometry shader si iesirea de la acesta devine intrare pentru fragment shader (dupa alti cativa pasi ficsi).

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 intrare:
    layout(triangles) in;

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

  • Trebuie specificat tipul geometriei de la iesire
    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 intrarea va fi un vector de valori vec2.
    layout(location = 0) in vec2 vert_texcoord[];

    De asemenea exista si intrare implicita, dar cea 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 astfel incat sa existe cate 4 bambusi pe o coloana, si cel putin 2 coloane. Numarul de instante se poate controla de la tastatura
  3. Aplicati un proces de shrinking parametrizat asupra triunghiurilor obiectului. Parametrul de shrink trebuie controlat de la tastatura.

spg/laboratoare/01.txt · Last modified: 2021/10/15 10:23 by alexandru.gradinaru
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