+ All Categories
Home > Documents > Geometry and tessellation on GPU - cgg.mff.cuni.czpepca/lectures/pdf/hw-12-geomtess.en.pdf ·...

Geometry and tessellation on GPU - cgg.mff.cuni.czpepca/lectures/pdf/hw-12-geomtess.en.pdf ·...

Date post: 22-Aug-2019
Category:
Upload: duongque
View: 224 times
Download: 0 times
Share this document with a friend
39
Geometry & tessellation 2016 © Josef Pelikán, http://cgg.mff.cuni.cz/~pepca 1 / 39 Geometry and tessellation on GPU © 2012-2016 Josef Pelikán, Jan Horáček CGG MFF UK Praha [email protected] http://cgg.mff.cuni.cz/~pepca/
Transcript
Page 1: Geometry and tessellation on GPU - cgg.mff.cuni.czpepca/lectures/pdf/hw-12-geomtess.en.pdf · Geometry & tessellation 2016 © Josef Pelikán, pepca 2 / 39 Content advanced drawing

Geometry & tessellation 2016 © Josef Pelikán, http://cgg.mff.cuni.cz/~pepca 1 / 39

Geometry and tessellation on GPU

© 2012-2016 Josef Pelikán, Jan Horáček

CGG MFF UK Praha

[email protected]

http://cgg.mff.cuni.cz/~pepca/

Page 2: Geometry and tessellation on GPU - cgg.mff.cuni.czpepca/lectures/pdf/hw-12-geomtess.en.pdf · Geometry & tessellation 2016 © Josef Pelikán, pepca 2 / 39 Content advanced drawing

Geometry & tessellation 2016 © Josef Pelikán, http://cgg.mff.cuni.cz/~pepca 2 / 39

Content

advanced drawing modes in modern OpenGLprimitive types

vertex attributes

indirect drawing

instanced drawing, index offsets

Tessellation shaderstessellation control shader

tessellation evaluation shader

Geometry shaders

Page 3: Geometry and tessellation on GPU - cgg.mff.cuni.czpepca/lectures/pdf/hw-12-geomtess.en.pdf · Geometry & tessellation 2016 © Josef Pelikán, pepca 2 / 39 Content advanced drawing

Geometry & tessellation 2016 © Josef Pelikán, http://cgg.mff.cuni.cz/~pepca 3 / 39

Geometry primitives

deprecated primitivesGL_QUADS, GL_QUAD_STRIP

GL_POLYGON

new primitives with adjacency (for subdivision..)GL_LINES_ADJACENCY

GL_LINE_STRIP_ADJACENCY

GL_TRIANGLES_ADJACENCY

GL_TRIANGLE_STRIP_ADJACENCY

Page 4: Geometry and tessellation on GPU - cgg.mff.cuni.czpepca/lectures/pdf/hw-12-geomtess.en.pdf · Geometry & tessellation 2016 © Josef Pelikán, pepca 2 / 39 Content advanced drawing

Geometry & tessellation 2016 © Josef Pelikán, http://cgg.mff.cuni.cz/~pepca 4 / 39

Geometric primitives I

GL_POINTS

V0V1

V2

V3

V4

V5

GL_LINES

V0V1

V2

V3

V4

V5

GL_LINE_STRIP

V0V1

V2

V3

V4

V5

GL_LINE_LOOP

V0V1

V2

V3

V4

V5

Page 5: Geometry and tessellation on GPU - cgg.mff.cuni.czpepca/lectures/pdf/hw-12-geomtess.en.pdf · Geometry & tessellation 2016 © Josef Pelikán, pepca 2 / 39 Content advanced drawing

Geometry & tessellation 2016 © Josef Pelikán, http://cgg.mff.cuni.cz/~pepca 5 / 39

Geometric primitives II

GL_TRIANGLES

V0V1

V2

V3

V4

V5

GL_TRIANGLE_STRIP

V0V1

V2

V3

V5

V4

GL_TRIANGLE_FAN

V6

V0

V5

V4

V3

V2

V1

Page 6: Geometry and tessellation on GPU - cgg.mff.cuni.czpepca/lectures/pdf/hw-12-geomtess.en.pdf · Geometry & tessellation 2016 © Josef Pelikán, pepca 2 / 39 Content advanced drawing

Geometry & tessellation 2016 © Josef Pelikán, http://cgg.mff.cuni.cz/~pepca 6 / 39

Geometric primitives III

GL_LINES_ADJACENCY

V0V3

V1 V2

V6

V5

GL_LINE_STRIP_ADJACENCY

V6

V0

V5

V4

V3

V2V1

V4

V7

V7

Page 7: Geometry and tessellation on GPU - cgg.mff.cuni.czpepca/lectures/pdf/hw-12-geomtess.en.pdf · Geometry & tessellation 2016 © Josef Pelikán, pepca 2 / 39 Content advanced drawing

Geometry & tessellation 2016 © Josef Pelikán, http://cgg.mff.cuni.cz/~pepca 7 / 39

Geometric primitives IV

V0

V3

V1

V2

V6

V5

V5

V4

V3

V4

V7

V1

V0

V10

V2

V11

V8

V9

GL_TRIANGLES_ADJACENCY GL_TRIANGLE_STRIP_ADJACENCY

Page 8: Geometry and tessellation on GPU - cgg.mff.cuni.czpepca/lectures/pdf/hw-12-geomtess.en.pdf · Geometry & tessellation 2016 © Josef Pelikán, pepca 2 / 39 Content advanced drawing

Geometry & tessellation 2016 © Josef Pelikán, http://cgg.mff.cuni.cz/~pepca 8 / 39

Geometric primitives V

V0 … VN-1

GL_PATCHES

??

Page 9: Geometry and tessellation on GPU - cgg.mff.cuni.czpepca/lectures/pdf/hw-12-geomtess.en.pdf · Geometry & tessellation 2016 © Josef Pelikán, pepca 2 / 39 Content advanced drawing

Geometry & tessellation 2016 © Josef Pelikán, http://cgg.mff.cuni.cz/~pepca 9 / 39

Vertex data

vertex attributesneed to be bound to shader variables

attribute position definition

explicit – layout (in shader)

explicit – glBindAttribLocation()

automatic – glGetAttribLocation()

Page 10: Geometry and tessellation on GPU - cgg.mff.cuni.czpepca/lectures/pdf/hw-12-geomtess.en.pdf · Geometry & tessellation 2016 © Josef Pelikán, pepca 2 / 39 Content advanced drawing

Geometry & tessellation 2016 © Josef Pelikán, http://cgg.mff.cuni.cz/~pepca 10 / 39

Interlaced examplestruct VertexData{ GLfloat tc[2]; // texture coordinates GLubyte c[4]; // vertex color GLfloat v[3]; // vertex coordinate}Glsizei stride = sizeof( VertexData ); // vertex strideGlsizeiptr offset = 0;

glVertexAttribPointer( vTexCoord, 2, GL_FLOAT, GL_FALSE, stride, BUFFER_OFFSET(offset) );offset += sizeof( VertexData.tc );

glVertexAttribPointer( vColor, 4, GL_UNSIGNED_BYTE, GL_TRUE, stride, BUFFER_OFFSET(offset) );offset += sizeof( VertexData.c );

glVertexAttribPointer( vPos, 3, GL_FLOAT, GL_FALSE, stride, BUFFER_OFFSET(offset) );

Page 11: Geometry and tessellation on GPU - cgg.mff.cuni.czpepca/lectures/pdf/hw-12-geomtess.en.pdf · Geometry & tessellation 2016 © Josef Pelikán, pepca 2 / 39 Content advanced drawing

Geometry & tessellation 2016 © Josef Pelikán, http://cgg.mff.cuni.cz/~pepca 11 / 39

Interlaced example

declare which vertex arrays will be used

glEnableVertexAttribArray( vPos );

glEnableVertexAttribArray( vColor );

glEnableVertexAttribArray( vTextCoord );

Page 12: Geometry and tessellation on GPU - cgg.mff.cuni.czpepca/lectures/pdf/hw-12-geomtess.en.pdf · Geometry & tessellation 2016 © Josef Pelikán, pepca 2 / 39 Content advanced drawing

Geometry & tessellation 2016 © Josef Pelikán, http://cgg.mff.cuni.cz/~pepca 12 / 39

Rendering primitives (batch)

continuous array of vertices without indices

glDrawArrays( GL_TRIANGLE_STRIP, 0, n );

indexed rendering (using index buffer)

glDrawElements( GL_TRIANGLE_STRIP, n, GL_UNSIGNED_INT, BUFFER_OFFSET(off) );

# of vertices

index type buffer offset

buffer offset

Page 13: Geometry and tessellation on GPU - cgg.mff.cuni.czpepca/lectures/pdf/hw-12-geomtess.en.pdf · Geometry & tessellation 2016 © Josef Pelikán, pepca 2 / 39 Content advanced drawing

Geometry & tessellation 2016 © Josef Pelikán, http://cgg.mff.cuni.cz/~pepca 13 / 39

Instanced rendering

just repetition of the same rendering datavertex shader updates its behavior according to builtin internal integer variable gl_InstanceID

glDrawArraysInstanced( GL_TRIANGLE_STRIP, 0, n, 10 );

glDrawElementsInstanced( GL_TRIANGLE_STRIP, n, GL_UNSIGNED_INT, BUFFER_OFFSET(0), 10 );

# of instances

Page 14: Geometry and tessellation on GPU - cgg.mff.cuni.czpepca/lectures/pdf/hw-12-geomtess.en.pdf · Geometry & tessellation 2016 © Josef Pelikán, pepca 2 / 39 Content advanced drawing

Geometry & tessellation 2016 © Josef Pelikán, http://cgg.mff.cuni.cz/~pepca 14 / 39

Relative indexed rendering

index offsetthe same topology with different geometry

remember “Geometry Clipmaps” (Hoppe et al.)

glDrawElementsBaseVertex() glDrawRangeElementsBaseVertex() glDrawElementsInstancedBaseVertex()

glDrawElementsBaseVertex( GL_TRIANGLES, n, GL_UNSIGNED_INT, BUFFER_OFFSET(0), 200 );

index offset

Page 15: Geometry and tessellation on GPU - cgg.mff.cuni.czpepca/lectures/pdf/hw-12-geomtess.en.pdf · Geometry & tessellation 2016 © Josef Pelikán, pepca 2 / 39 Content advanced drawing

Geometry & tessellation 2016 © Josef Pelikán, http://cgg.mff.cuni.cz/~pepca 15 / 39

Indirect rendering

data are stored in a server-side buffer (GL_DRAW_INDIRECT_BUFFER)

alternatives to classical rendering functions, e.g.:

glDrawArraysIndirect() glMultiDrawArraysIndirect() glMultiDrawElementsIndirect()

glDrawElementsIndirect( GL_TRIANGLES, GL_FLOAT, BUFFER_OFFSET(0) );

indirect buffer offset

Page 16: Geometry and tessellation on GPU - cgg.mff.cuni.czpepca/lectures/pdf/hw-12-geomtess.en.pdf · Geometry & tessellation 2016 © Josef Pelikán, pepca 2 / 39 Content advanced drawing

Geometry & tessellation 2016 © Josef Pelikán, http://cgg.mff.cuni.cz/~pepca 16 / 39

Indirect rendering – buffer datatypedef struct

{

uint count; // number of vertices (elements)

uint primCount; // number of instances

uint firstIndex; // index buffer offset

uint baseVertex; // vertex offset

uint baseInstance; // instance offset

} DrawElementsIndirectCommand;

Page 17: Geometry and tessellation on GPU - cgg.mff.cuni.czpepca/lectures/pdf/hw-12-geomtess.en.pdf · Geometry & tessellation 2016 © Josef Pelikán, pepca 2 / 39 Content advanced drawing

Geometry & tessellation 2016 © Josef Pelikán, http://cgg.mff.cuni.cz/~pepca 17 / 39

Tessellation shadersintroduced in OpenGL 4.0 (March 2010)

tessellation shaders- tessellation control shader- tessellation evaluation shader

efficient but geometrically simple surface tesselation

Page 18: Geometry and tessellation on GPU - cgg.mff.cuni.czpepca/lectures/pdf/hw-12-geomtess.en.pdf · Geometry & tessellation 2016 © Josef Pelikán, pepca 2 / 39 Content advanced drawing

Geometry & tessellation 2016 © Josef Pelikán, http://cgg.mff.cuni.cz/~pepca 18 / 39

Tessellation shadersgeometric primitive – GL_PATCHES

arbitrary semantics – depends on a developer (struct[])3 modules: one configurable, two programmable ones

Tessellation Primitive Generator (“for” loops)

Tessellation Control Shaderin – patch attributes (array of vertex attributes)out – patch attributes (dtto)defines tessellation parameters (for the TPG)

Tessellation Evaluation Shaderin – patch attributes (dtto)out – vertex attributes of output primitives

Page 19: Geometry and tessellation on GPU - cgg.mff.cuni.czpepca/lectures/pdf/hw-12-geomtess.en.pdf · Geometry & tessellation 2016 © Josef Pelikán, pepca 2 / 39 Content advanced drawing

Geometry & tessellation 2016 © Josef Pelikán, http://cgg.mff.cuni.cz/~pepca 19 / 39

Tessellation modules

Page 20: Geometry and tessellation on GPU - cgg.mff.cuni.czpepca/lectures/pdf/hw-12-geomtess.en.pdf · Geometry & tessellation 2016 © Josef Pelikán, pepca 2 / 39 Content advanced drawing

Geometry & tessellation 2016 © Josef Pelikán, http://cgg.mff.cuni.cz/~pepca 20 / 39

Data flow in tessellation subsystemtessellation shaders are working on vertex sets

input and output data are arrays

builtin gl_in[] variable – input for both tess. shaders

builtin gl_out[] variable (can be modified by TCS)

vertex information: similar to “VertexShader-only” but in an array

in gl_PerVertex {

vec4 gl_Position;

float gl_PointSize;

vec4 gl_ClipDistance[];

} gl_in[];

Page 21: Geometry and tessellation on GPU - cgg.mff.cuni.czpepca/lectures/pdf/hw-12-geomtess.en.pdf · Geometry & tessellation 2016 © Josef Pelikán, pepca 2 / 39 Content advanced drawing

Geometry & tessellation 2016 © Josef Pelikán, http://cgg.mff.cuni.cz/~pepca 21 / 39

Tessellation Control Shaderoutput layout vertices defines number of output vertices

TCS is called for every output patch vertex

input & output data … patchaccess to all input attributes

allowed to write only to its outputgl_InvocationID

basic task of TCSsetup tessellation parametersprepare (optionally recompute) output patch data

Page 22: Geometry and tessellation on GPU - cgg.mff.cuni.czpepca/lectures/pdf/hw-12-geomtess.en.pdf · Geometry & tessellation 2016 © Josef Pelikán, pepca 2 / 39 Content advanced drawing

Geometry & tessellation 2016 © Josef Pelikán, http://cgg.mff.cuni.cz/~pepca 22 / 39

Tessellation Control Shader example#version 400 core

layout (vertices = 4) out;

uniform float Inner;uniform float Outer;

void main (){ if ( gl_InvocationID == 0 ) { gl_TessLevelInner[ 0 ] = gl_TessLevelInner[ 1 ] = Inner;

gl_TessLevelOuter[ 0 ] = gl_TessLevelOuter[ 1 ] = gl_TessLevelOuter[ 2 ] = gl_TessLevelOuter[ 3 ] = Outer; }

gl_out[ gl_InvocationID ].gl_Position = gl_in[ gl_InvocationID ].gl_Position;}

Page 23: Geometry and tessellation on GPU - cgg.mff.cuni.czpepca/lectures/pdf/hw-12-geomtess.en.pdf · Geometry & tessellation 2016 © Josef Pelikán, pepca 2 / 39 Content advanced drawing

Geometry & tessellation 2016 © Josef Pelikán, http://cgg.mff.cuni.cz/~pepca 23 / 39

Generated primitives

Type Param space Tessellation factors

quad unit square( u, v )

gl_TessLevelInner: 0 … 1

gl_TessLevelOuter: 0 … 3

triangle barycentric( u, v, w )

gl_TessLevelInner: 0

gl_TessLevelOuter: 0 … 2

isolines line ( u, v )'v' is constant for a line

gl_TessLevelOuter: 0 … 1

Page 24: Geometry and tessellation on GPU - cgg.mff.cuni.czpepca/lectures/pdf/hw-12-geomtess.en.pdf · Geometry & tessellation 2016 © Josef Pelikán, pepca 2 / 39 Content advanced drawing

Geometry & tessellation 2016 © Josef Pelikán, http://cgg.mff.cuni.cz/~pepca 24 / 39

Quad examplegl_TessLevelInner[0] = 3.0;gl_TessLevelInner[1] = 4.0;

gl_TessLevelOuter[0] = 3.0;gl_TessLevelOuter[1] = 4.0;gl_TessLevelOuter[2] = 2.0;gl_TessLevelOuter[3] = 3.0;

// using equal_spacing

Page 25: Geometry and tessellation on GPU - cgg.mff.cuni.czpepca/lectures/pdf/hw-12-geomtess.en.pdf · Geometry & tessellation 2016 © Josef Pelikán, pepca 2 / 39 Content advanced drawing

Geometry & tessellation 2016 © Josef Pelikán, http://cgg.mff.cuni.cz/~pepca 25 / 39

Triangle examplegl_TessLevelInner[0] = 5.0;

gl_TessLevelOuter[0] = 3.0;gl_TessLevelOuter[1] = 4.0;gl_TessLevelOuter[2] = 2.0;

// using equal_spacing

Page 26: Geometry and tessellation on GPU - cgg.mff.cuni.czpepca/lectures/pdf/hw-12-geomtess.en.pdf · Geometry & tessellation 2016 © Josef Pelikán, pepca 2 / 39 Content advanced drawing

Geometry & tessellation 2016 © Josef Pelikán, http://cgg.mff.cuni.cz/~pepca 26 / 39

Lines examplegl_TessLevelOuter[0] = 7.0;gl_TessLevelOuter[1] = 4.0;

// using equal_spacing

Page 27: Geometry and tessellation on GPU - cgg.mff.cuni.czpepca/lectures/pdf/hw-12-geomtess.en.pdf · Geometry & tessellation 2016 © Josef Pelikán, pepca 2 / 39 Content advanced drawing

Geometry & tessellation 2016 © Josef Pelikán, http://cgg.mff.cuni.cz/~pepca 27 / 39

Tessellation control w/o shader

in many cases we only need to copy data and configure Tessellation Primitive Generator..

if input and output patch have the same vertex-number:

glPatchParameteri( GL_PATCH_VERTICES, vertices )

inner and outer tessellation parameters (array lengths!):

GLfloat outer[ 4 ], inner[ 2 ];

glPatchParameterfv( GL_PATCH_DEFAULT_OUTER_LEVEL, outer );

glPatchParameterfv( GL_PATCH_DEFAULT_INNER_LEVEL, inner );

Page 28: Geometry and tessellation on GPU - cgg.mff.cuni.czpepca/lectures/pdf/hw-12-geomtess.en.pdf · Geometry & tessellation 2016 © Josef Pelikán, pepca 2 / 39 Content advanced drawing

Geometry & tessellation 2016 © Josef Pelikán, http://cgg.mff.cuni.cz/~pepca 28 / 39

Tessellation Evaluation Shader

called independently for every vertex of the output mesh

input data … patchgl_in[].gl_Position …gl_TessCoord.xy, gl_TessCoord.xyz

output … vertex attributes (coordinate vector is mandatory)gl_Position

Page 29: Geometry and tessellation on GPU - cgg.mff.cuni.czpepca/lectures/pdf/hw-12-geomtess.en.pdf · Geometry & tessellation 2016 © Josef Pelikán, pepca 2 / 39 Content advanced drawing

Geometry & tessellation 2016 © Josef Pelikán, http://cgg.mff.cuni.cz/~pepca 29 / 39

Tessellation Evaluation Shader example#version 400 core

layout ( quads, equal_spacing, ccw ) in;

uniform mat4 MV, P; // model-view, projection

float B ( int I, float u ){ const vec4 bc = vec4( 1, 3, 3, 1 ); return bc[i] * pow( u, i ) * pow( 1.0 - u, 3 - i );}

void main (){ float u = gl_TessCoord.x, v = gl_TessCoord.y;

vec4 pos = vec4( 0.0 ); for ( int j = 0; j < 4; j++ ) for ( int i = 0; i < 4; i++ ) pos += B(i,u) * B(j,v) * gl_in[ 4*j + i ].gl_Position;

gl_Position = P * MV * pos;}

Page 30: Geometry and tessellation on GPU - cgg.mff.cuni.czpepca/lectures/pdf/hw-12-geomtess.en.pdf · Geometry & tessellation 2016 © Josef Pelikán, pepca 2 / 39 Content advanced drawing

Geometry & tessellation 2016 © Josef Pelikán, http://cgg.mff.cuni.cz/~pepca 30 / 39

Tessellation positions

tessellation factors are floating point numbers!GL_MAX_TESS_GEN_LEVELS (at least 64)

Tessellation mode Allowed values Subdivision

equal_spacing [ 1, MAX ] rounds up to integerequal intervals

fractional_even_spacing [ 2, MAX ] rounds up to even intn-2 equal intervals2 shorter

fractional_odd_spacing [ 1, MAX-1 ] rounds up to odd intn-2 equal intervals, …

Page 31: Geometry and tessellation on GPU - cgg.mff.cuni.czpepca/lectures/pdf/hw-12-geomtess.en.pdf · Geometry & tessellation 2016 © Josef Pelikán, pepca 2 / 39 Content advanced drawing

Geometry & tessellation 2016 © Josef Pelikán, http://cgg.mff.cuni.cz/~pepca 31 / 39

Primitive winding, Point mode

default winding = counter-clockwise (ccw)use 'cw' for reverse direction

there is an option for generating points instead of triangles

use 'point_mode' in the 'layout' directive

layout ( triangles, cw, fractional_odd_spacing,

point_mode ) in;

Page 32: Geometry and tessellation on GPU - cgg.mff.cuni.czpepca/lectures/pdf/hw-12-geomtess.en.pdf · Geometry & tessellation 2016 © Josef Pelikán, pepca 2 / 39 Content advanced drawing

Geometry & tessellation 2016 © Josef Pelikán, http://cgg.mff.cuni.cz/~pepca 32 / 39

Geometry shaderlast optional stage before rasterizing stages

able to generate new geometry – general approach- no strict limits on output topology

number and type of output primitives

Page 33: Geometry and tessellation on GPU - cgg.mff.cuni.czpepca/lectures/pdf/hw-12-geomtess.en.pdf · Geometry & tessellation 2016 © Josef Pelikán, pepca 2 / 39 Content advanced drawing

Geometry & tessellation 2016 © Josef Pelikán, http://cgg.mff.cuni.cz/~pepca 33 / 39

Geometry shader input

assembled primitives (no strips or fans)points (1 v)lines (2 v)lines_adjacency (4 v)triangles (3 v)triangles_adjacency (6 v)

access to the whole primitiveadjacency for continuity

in gl_PerVertex

{

vec4 gl_Position;

float gl_PointSize;

float gl_ClipDistance[];

} gl_in[];

in int gl_PrimitiveIdIn;

// only in OpenGL 4.0+

in int gl_InvocationID;

Page 34: Geometry and tessellation on GPU - cgg.mff.cuni.czpepca/lectures/pdf/hw-12-geomtess.en.pdf · Geometry & tessellation 2016 © Josef Pelikán, pepca 2 / 39 Content advanced drawing

Geometry & tessellation 2016 © Josef Pelikán, http://cgg.mff.cuni.cz/~pepca 34 / 39

Geometry shader output

possible output primitivespointsline_striptriangle_strip

output primitive type is independent on input

zero or more output primitivese.g. two triangle-strips, each of 100 triangles..

implementation is not necessary optimal for massive geometry generation

that is what tessellation stages are for..

Page 35: Geometry and tessellation on GPU - cgg.mff.cuni.czpepca/lectures/pdf/hw-12-geomtess.en.pdf · Geometry & tessellation 2016 © Josef Pelikán, pepca 2 / 39 Content advanced drawing

Geometry & tessellation 2016 © Josef Pelikán, http://cgg.mff.cuni.cz/~pepca 35 / 39

Geometry shader output

vec4 gl_Position;float gl_PointSize;float gl_ClipDistance[];

out int gl_PrimitiveID;out int gl_Layer;

// only in OpenGL 4.0+out int gl_ViewportIndex;

Page 36: Geometry and tessellation on GPU - cgg.mff.cuni.czpepca/lectures/pdf/hw-12-geomtess.en.pdf · Geometry & tessellation 2016 © Josef Pelikán, pepca 2 / 39 Content advanced drawing

Geometry & tessellation 2016 © Josef Pelikán, http://cgg.mff.cuni.cz/~pepca 36 / 39

Geometry shader example#version 400 core

layout ( triangles, invocations = 1 ) in;

layout ( triangle_strip, max_vertices = 3 ) out;

uniform float scale;

void main()

{

vec4 v[3], center = vec4( 0 );

for ( int i = 0; i < 3; i++ ) {

v[i] = gl_in[ i ].gl_Position;

center += v[ i ];

}

center /= 3;

for ( int i = 0; i < 3; i++ ) {

gl_Position = mix( v[ i ], center, scale );

EmitVertex();

}

EndPrimitive();

}

Page 37: Geometry and tessellation on GPU - cgg.mff.cuni.czpepca/lectures/pdf/hw-12-geomtess.en.pdf · Geometry & tessellation 2016 © Josef Pelikán, pepca 2 / 39 Content advanced drawing

Geometry & tessellation 2016 © Josef Pelikán, http://cgg.mff.cuni.cz/~pepca 37 / 39

Geometry vs. Tessellation shaders I

primitive generationGeometry: explicit control

Tessellation: only parameter control

topologyGeometry: access to limited neighborhood only

Tessellation: patch design is up to programmer

source primitivesGeometry: limited set

Tessellation: arbitrary (patch is general primitive)

Page 38: Geometry and tessellation on GPU - cgg.mff.cuni.czpepca/lectures/pdf/hw-12-geomtess.en.pdf · Geometry & tessellation 2016 © Josef Pelikán, pepca 2 / 39 Content advanced drawing

Geometry & tessellation 2016 © Josef Pelikán, http://cgg.mff.cuni.cz/~pepca 38 / 39

Geometry vs. Tessellation shaders II

mesh cracksGeometry: problematic, should be handled carefully

Tessellation: automatic elimination (mesh is waterproof by design)

Page 39: Geometry and tessellation on GPU - cgg.mff.cuni.czpepca/lectures/pdf/hw-12-geomtess.en.pdf · Geometry & tessellation 2016 © Josef Pelikán, pepca 2 / 39 Content advanced drawing

Geometry & tessellation 2016 © Josef Pelikán, http://cgg.mff.cuni.cz/~pepca 39 / 39

Sources

Tomas Akenine-Möller, Eric Haines: Real-time rendering, 3rd edition, A K Peters, 2008, ISBN: 9781568814247

OpenGL Architecture Review Board: OpenGL Pro-gramming: The Official Guide to Learning OpenGL, Ad-dison-Wesley, latest edition (8th edition for the OpenGL 4.1)

The Khronos Group: The OpenGL Graphics System: A Specification (Core/Compatibility profile), http://www.opengl.org/registry/


Recommended