OpenGL IV
Tesszelátor
Tesszelátor Mire jó? A geometria adaptív felosztására A geometria tömörítésére Displacement eljárások támogatására Level of detail Sziluett simítás Stb…
Tesszelátor Három shader lépcső Új geometriai primitív Tesselation Control Shader Tesselation Primitive Generator Tesselation Evaluation Shader Új geometriai primitív GL_PATCHES Teljesen a felhasználóra van bízva az értelmezés glPatchParameteri(GL_PATCH_VERTICES, vertNum);
Tesselation Control Shader A patch vertexein dolgozik A koordinátákból felület reprezentáció layout( vertices = n ) out; Felbontási paraméterek gl_TessLevelInner[2] gl_TessLevelOuter[4 ] Kimenő vertexenként hívódik
Tesselation Control Shader Bemeneti paraméterek Felhasználó által definiált Beépített in vec2 texCoord[]; // A patch definíciónak megfelelő elemszám. in int gl_PatchVerticesIn; // A patch-hoz tartozó vertexek száma. in int gl_PrimitiveID; // A patch sorszáma. in int gl_InvocationID; // A vertex patch-en belüli sorszáma. in gl_PerVertex { vec4 gl_Position; float gl_PointSize; float gl_ClipDistance[]; } gl_in[gl_MaxPatchVertices];
Tesselation Control Shader Kimeneti paraméterek Felhasználó által definiált Beépített Szinkronizáció out vec2 texCoord[]; // A patch definíciónak megfelelő elemszám. patch out vec4 data; // Teljes patch-re vonatkozó adatok. patch out float gl_TessLevelOuter[4]; // Külső felbontási paraméter. patch out float gl_TessLevelInner[2]; // Belső felbontási paraméter. out gl_PerVertex { vec4 gl_Position; float gl_PointSize; float gl_ClipDistance[]; } gl_out[]; barrier(); // A TCS hívások között szinkronizál.
Tesselation Primitive Generator Fix funkciójú lépcső A TCS-ből érkező vertexekből generál háromszögeket négyszögeket szakaszokat Kimenete u,v,w baricentrikus koordináták
Tesselation Evaluation Shader A felosztott geometriát állítja elő Bemenetei A TCS kimenete A TPG által előállított baricentrikus koordináták A felosztás értelmezése Csak a primitív típus kötelező Kimenete Egy vertexhez tartozó tulajdonságok layout(primitív típus, felosztás típus, irányítás, pont generálás) in;
Tesselation Evaluation Shader Primitív típus isolines a patch párhuzamos szakaszok csoportja a kimenet szakaszok csoportja triangles a patch egy háromszög a kimenet háromszögek csoportja quads a patch egy négyszög
Tesselation Evaluation Shader Felosztás típus equal_spacing a vertexek között azonos távolság fractional_even_spacing páratlan számú szegmens kettő kivételével fix hosszú szegmensek a maradék a két szélső darabra kerül egyenlően fractional_odd_spacing páros számú szegmens a többi azonos az előző esettel
Tesselation Evaluation Shader Bejárás cw: az óra járásának megfelelő ccw: az óra járásával ellentétes csak az absztrakt patch vertexeinek sorrendjét adja meg a kimenet ettől független Pont generálás point_mode: a kimenet pont primitív legyen
Tesselation Evaluation Shader Bemeneti paraméterek Felhasználó által definiált Beépített TCS paraméterek in vec2 texCoord[]; // A patch definíciónak megfelelő elemszám. patch in vec4 data; // A teljes patch-re közös adat. in vec3 gl_TessCoord; // Absztrakt koordináták a TPG-ből. in int gl_PatchVerticesIn; // A patch-hoz tartozó vertexek száma. in int gl_PrimitiveID; // A patch sorszáma. in gl_PerVertex { vec4 gl_Position; float gl_PointSize; float gl_ClipDistance[]; } gl_in[gl_MaxPatchVertices]; patch in float gl_TessLevelOuter[4]; // Külső felbontási paraméter. patch in float gl_TessLevelInner[2]; // Belső felbontási paraméter.
Tesselation Evaluation Shader Kimeneti paraméterek Felhasználó által definiált Beépített out vec2 texCoord; // A vertexhez tartozó adat. out gl_PerVertex { vec4 gl_Position; float gl_PointSize; float gl_ClipDistance[]; } gl_out[];
TES Topológia Háromszög (u,v,w) = (0, 1, 0) OL0 OL2 IL0
TES Topológia Négyszög (u,v) = (0, 1) (u,v) = (1, 1) OL3 IL0 OL0 IL1
TES Topológia Szakaszok (u,v) = (0, 1) (u,v) = (1, 1) OL0
Példa: Háromszög felosztás
Példa: Háromszög felosztás
Példa: Háromszög felosztás Tesselation Control Shader #version 430 layout(vertices = 3) out; in vec3 tPosition[]; out vec3 tcPosition[]; uniform int tessLevelInner; uniform int tessLevelOuter; void main(){ tcPosition[gl_InvocationID] = tPosition[gl_InvocationID]; if(gl_InvocationID == 0){ gl_TessLevelInner[0] = tessLevelInner; gl_TessLevelOuter[0] = tessLevelOuter; gl_TessLevelOuter[1] = tessLevelOuter; gl_TessLevelOuter[2] = tessLevelOuter; }
Példa: Háromszög felosztás Tesselation Evaluation Shader #version 430 layout(triangles, equal_spacing, cw) in; uniform mat4 MV; in vec3 tcPosition[]; out vec3 tePosition; void main() { vec3 p0 = gl_TessCoord.x * tcPosition[0]; vec3 p1 = gl_TessCoord.y * tcPosition[1]; vec3 p2 = gl_TessCoord.z * tcPosition[2]; tePosition = p0 + p1 + p2; gl_Position = MV * vec4(tePosition, 1); }
Feladat Szabályos rács generálása Távolság alapján felosztás (LoD) Magasságmező megjelenítés