This is an old revision of the document!


Laboratorul 08

Programe de tip shader pentru prelucrarea topologiei

În continuare vom analiza un geometry shader simplu, precum și comunicarea dintre vertex shader și geometry shader:

  • Un exemplu de vertex shader:
    #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;
     
    out vec2 vert_texcoord;
    //coordonatele textură ale vârfului
    //ieșirea lui vertex shader este intrare pentru geometry shader
     
     
    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;
    //intrarea este un triunghi
     
    layout(triangle_strip, max_vertices = 4) out;
    //ieșirea este un triangle strip. Se vor genera maxim 4 vârfuri
     
    layout(location = 0) in vec2 vert_texcoord[3];
    //intrarea - coordonatele textură ale vârfurilor unui triunghi
     
    layout(location = 0) out vec2 geom_texcoord;
    //coordonatele textură asociate fiecărui vârf emis
     
    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 
    }

Input si Output

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

    Trebuie să fie unul dintre: points, lines, lines_adjacency, triangles, triangles_adjacency

  • Trebuie specificat tipul geometriei de la ieșire
    layout(triangle_strip, max_vertices = 5) out;

    Trebuie să fie unul dintre: points, line_strip, triangle_strip

  • Se primesc coordonatele de textura de la toată primitiva (triunghiul). Astfel că intrarea va fi un vector de 3 valori vec2.
    layout(location = 0) in vec2 vert_texcoord[3];
  • Nu este necesar să se dea dimensiunea vectorului. Astfel, codul de mai sus se poate scrie:
    layout(location = 0) in vec2 vert_texcoord[];
  • De asemenea, există și intrare implicită la geometry shader, numită gl_in, din care ne interesează gl_Position:
    in gl_PerVertex
    {
      vec4 gl_Position;
      ...
    } gl_in[];
  • Ieșirea lui geometry shader va fi descrisă în secțiunea următoare:
    layout(location = 0) out vec2 geom_texcoord;

Emiterea de primitive

Pentru fiecare vârf emis din geometry shader se pot asocia coordonate textură, normală, culoare, asociate vârfului (setate î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():

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

Î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.1701779730.txt.gz · Last modified: 2023/12/05 14:35 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