This is an old revision of the document!
lab_list.h
, linia #include “lab/lab8/lab8.h”
.
În continuare vom analiza un geometry shader simplu, precum și comunicarea dintre vertex shader și geometry 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; }
#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 }
layout(triangles) in;
Trebuie să fie unul dintre: points
, lines
, lines_adjacency
, triangles
, triangles_adjacency
layout(triangle_strip, max_vertices = 5) out;
Trebuie să fie unul dintre: points
, line_strip
, triangle_strip
vec2
. layout(location = 0) in vec2 vert_texcoord[3];
layout(location = 0) in vec2 vert_texcoord[];
gl_in
, din care ne interesează gl_Position
: in gl_PerVertex { vec4 gl_Position; ... } gl_in[];
layout(location = 0) out vec2 geom_texcoord;
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()
:
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).