GLSL Geometry Shaders

Similar documents
Stripes, Rings, and Dots!

A Tessellated Parametric Triangular Bézier Patch

Introduction to the OpenGL Shading Language (GLSL)

Tessellation Shaders

The Basic Computer Graphics Pipeline, OpenGL-style. Introduction to the OpenGL Shading Language (GLSL)

GPU Programming EE Final Examination

The Transition from RenderMan to the OpenGL Shading Language (GLSL)

Introduction to Shaders for Visualization. The Basic Computer Graphics Pipeline

GPU Programming EE Final Examination

GPU Programming EE Final Examination

The OpenGL Shading Language

Bump Mapping. Mike Bailey. What is Bump-Mapping?

Advanced Computer Graphics

Shader Programs. Lecture 30 Subsections 2.8.2, Robb T. Koether. Hampden-Sydney College. Wed, Nov 16, 2011

GLSL Introduction. Fu-Chung Huang. Thanks for materials from many other people

Programming with OpenGL Part 3: Shaders. Ed Angel Professor of Emeritus of Computer Science University of New Mexico

Programmable GPUs. Real Time Graphics 11/13/2013. Nalu 2004 (NVIDIA Corporation) GeForce 6. Virtua Fighter 1995 (SEGA Corporation) NV1

Supplement to Lecture 22

LSU EE Homework 5 Solution Due: 27 November 2017

Geometry Shaders. And how to use them

Programming shaders & GPUs Christian Miller CS Fall 2011

SHADER PROGRAMMING. Based on Jian Huang s lecture on Shader Programming

Programmable Graphics Hardware

GPU Programming EE Final Examination

The Graphics Pipeline and OpenGL III: OpenGL Shading Language (GLSL 1.10)!

The Graphics Pipeline

Today s Agenda. Basic design of a graphics system. Introduction to OpenGL

12.2 Programmable Graphics Hardware

The Graphics Pipeline

CS 432 Interactive Computer Graphics

How to use tessellation to add geometric detail to your scenes. How to use geometry shaders to process whole primitives and create geometry on the fly

GLSL Introduction. Fu-Chung Huang. Thanks for materials from many other people

CSE 167: Lecture #8: GLSL. Jürgen P. Schulze, Ph.D. University of California, San Diego Fall Quarter 2012

Using Shaders for Lighting

Shader Programming. Daniel Wesslén, Stefan Seipel, Examples

Programming with OpenGL Shaders I. Adapted From: Ed Angel Professor of Emeritus of Computer Science University of New Mexico

Programming with OpenGL Shaders I. Adapted From: Ed Angel Professor of Emeritus of Computer Science University of New Mexico

Information Coding / Computer Graphics, ISY, LiTH GLSL. OpenGL Shading Language. Language with syntax similar to C

CSE 167: Introduction to Computer Graphics Lecture #13: GLSL. Jürgen P. Schulze, Ph.D. University of California, San Diego Fall Quarter 2015

OPENGL RENDERING PIPELINE

OpenGL Programmable Shaders

LSU EE Homework 3 Solution Due: 16 November 2012

Lecture 5 Vertex and Fragment Shaders-1. CITS3003 Graphics & Animation

Bump Mapping. Mike Bailey. Oregon State University. What is Bump-Mapping?

1 of 5 9/10/ :11 PM

Graphics Shaders. Theory and Practice. Second Edition. Mike Bailey. Steve Cunningham. CRC Press. Taylor&FnincIs Croup tootutor London New York

Graphics Programming. Computer Graphics, VT 2016 Lecture 2, Chapter 2. Fredrik Nysjö Centre for Image analysis Uppsala University

Lecture 09: Shaders (Part 1)

GLSL 1: Basics. J.Tumblin-Modified SLIDES from:

Today. Rendering - III. Outline. Texturing: The 10,000m View. Texture Coordinates. Specifying Texture Coordinates in GL

Introduction to Shaders.

CS195V Week 3. GLSL Programming

Computer Graphics with OpenGL ES (J. Han) Chapter 6 Fragment shader

Computergrafik. Matthias Zwicker Universität Bern Herbst 2016

2D graphics with WebGL

Using GPU Shaders for Visualization, II

Shading Language Update

Programming Graphics Hardware

Using Shaders for Lighting

The Graphics Pipeline and OpenGL III: OpenGL Shading Language (GLSL 1.10)!

Programmable GPUs Outline

Information Coding / Computer Graphics, ISY, LiTH GLSL. OpenGL Shading Language. Language with syntax similar to C

Some advantages come from the limited environment! No classes. Stranight ans simple code. Remarkably. Avoids most of the bad things with C/C++.

Dave Shreiner, ARM March 2009

HW-Tessellation Basics

Vertex Buffers. Mike Bailey. What is a Vertex Buffer?

Vertex Buffers. Mike Bailey. Computer Graphics VertexBuffers.pptx

Objectives. Open GL Shading Language (GLSL)

Shader Programming 1. Examples. Vertex displacement mapping. Daniel Wesslén 1. Post-processing, animated procedural textures

Lecture 17: Shading in OpenGL. CITS3003 Graphics & Animation

C P S C 314 S H A D E R S, O P E N G L, & J S RENDERING PIPELINE. Mikhail Bessmeltsev

Sign up for crits! Announcments

OPENGL AND GLSL. Computer Graphics

Content. Building Geometry Appearance Lights Model Loaders

CSE 167: Introduction to Computer Graphics Lecture #19: Wrapping Up. Jürgen P. Schulze, Ph.D. University of California, San Diego Fall Quarter 2017

CS 380 Introduction to Computer Graphics. LAB (1) : OpenGL Tutorial Reference : Foundations of 3D Computer Graphics, Steven J.

A Review of OpenGL Compute Shaders

BCA611 Video Oyunları için 3B Grafik

WebGL and GLSL Basics. CS559 Fall 2015 Lecture 10 October 6, 2015

Levy: Constraint Texture Mapping, SIGGRAPH, CS 148, Summer 2012 Introduction to Computer Graphics and Imaging Justin Solomon

GLSL v1.20. Scott MacHaffie Schrödinger, Inc.

CS4621/5621 Fall Computer Graphics Practicum Intro to OpenGL/GLSL

The Projection Matrix

TSBK 07! Computer Graphics! Ingemar Ragnemalm, ISY

Building Models. Prof. George Wolberg Dept. of Computer Science City College of New York

Accelerating the Hyperbolic Display of Complex 2D Scenes Using the GPU

Objectives Shading in OpenGL. Front and Back Faces. OpenGL shading. Introduce the OpenGL shading methods. Discuss polygonal shading

CS GPU and GPGPU Programming Lecture 7: Shading and Compute APIs 1. Markus Hadwiger, KAUST

CSE 4431/ M Advanced Topics in 3D Computer Graphics. TA: Margarita Vinnikov

Vincent Nozick. Graduate School of Science and Technology, Keio University, Japan.

2D Drawing Primitives

Lecture 4: Geometry Processing. Kayvon Fatahalian CMU : Graphics and Imaging Architectures (Fall 2011)

Vincent Nozick. Graduate School of Science and Technology, Université Paris Est LABINFO IGM UMR CNRS Keio University, Japan

Particle Systems with Compute & Geometry Shader. Institute of Computer Graphics and Algorithms Vienna University of Technology

GPU Programming EE Final Examination

CS 543 Lecture 1 (Part 3) Prof Emmanuel Agu. Computer Science Dept. Worcester Polytechnic Institute (WPI)

CSE 167: Introduction to Computer Graphics Lecture #7: GLSL. Jürgen P. Schulze, Ph.D. University of California, San Diego Spring Quarter 2016

CSE 4431/ M Advanced Topics in 3D Computer Graphics. TA: Margarita Vinnikov

Vertex Buffer Objects

Vertex Buffer Objects. Vertex Buffer Objects: The Big Idea

Transcription:

GLSL Geometry Shaders 1 This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International License Mike Bailey mjb@cs.oregonstate.edu geometry_shaders.pptx

Here s What We Know So Far 2 = Fixed Function = Programmable

Here s What We Know So Far 3 One Vertex In One Vertex Out

The Geometry Shader: Where Does it Fit in the Pipeline? 4 = Fixed Function = Programmable

Geometry Shader: What Does it Do? 5 Your application generates these Points, Lines, Line Strip, Line Loop,,Lines with Adjacency, Line Strip with Adjacency, Triangles, Triangle Strip, Triangle Fan, Triangles with Adjacency, Triangle Strip with Adjacency The driver translates those and feeds these one-at-a-time into the Geometry Shader Point, Line, Line with Adjacency, Triangle, Triangle with Adjacency The Geometry Shader generates (almost) as many of these as it wants Points, LineStrips, TriangleStrips There needn t be any correlation between Geometry Shader input type and Geometry Shader output type. Points can generate triangles, triangles can generate triangle strips, etc.

Additional Arguments Available for glbegin( ): 6 GL_LINES_ADJACENCY GL_LINE_STRIP_ADJACENCY GL_TRIANGLES_ADJACENCY GL_TRIANGLE_STRIP_ADJECENCY

Adjacency Primitives (and what they do by default) 7 This is what Fixed-Function OpenGL expects these vertices to mean. In Shader World, they can mean whatever you want them to mean. In Shader World, it s just a way to get multiple vertices into a Geometry Shader. Lines with Adjacency 0 1 2 3 4N vertices are given. (where N is the number of line segments to draw). A line segment is drawn between #1 and #2. Vertices #0 and #3 are there to provide adjacency information. N = 1 Line Strip with Adjacency 0 1 2 3 4 5 N = 3 N+3 vertices are given (where N is the number of line segments to draw). A line segment is drawn between #1 and #2, #2 and #3,, #N and #N+1. Vertices #0 and #N+2 are there to provide adjacency information.

Adjacency Primitives (and what they do by default) 8 2 Triangles with Adjacency 1 3 6N vertices are given (where N is the number of triangles to draw). Points 0, 2, and 4 define the triangle. Points 1, 3, and 5 tell where adjacent triangles are. 0 4 5 N = 1 5 9 Triangle Strip with Adjacency 1 2 6 10 4+2N vertices are given (where N is the number of triangles to draw). Points 0, 2, 4, 6, 8, 10, define the triangles. Points 1, 3, 5, 7, 9, 11, tell where adjacent triangles are. 0 4 8 N = 4 11 3 7

If a Vertex Shader Writes Variables as: then the Geometry Shader will Read Them as: and will Write Them to the Fragment Shader as: 9 gl_position gl_positionin[ ] gl_position gl_pointsize gl_pointsizein[ ] gl_pointsize gl_layer gl_layerin[ ] gl_layer out in out In the Geometry Shader, the dimensions indicated by are given by the variable gl_verticesin, although you will already know this by the type of geometry you are inputting 1 2 4 3 6 GL_POINTS GL_LINES GL_LINES_ADJACENCY GL_TRIANGLES GL_TRIANGLES_ADJACENCY

10 The Geometry Shader Can Assign These Built-in out Variables: gl_position gl_pointsize gl_layer gl_primitiveid When the Geometry Shader calls EmitVertex( ) this set of variables is copied to a slot in the shader s Primitive Assembly step Plus any of your own that you have declared to be out When the Geometry Shader calls EndPrimitive( ) the vertices that have been saved in the Primitive Assembly step are then assembled, rasterized, etc. Note: there is no BeginPrimitive( ) routine. It is implied by (1) the start of the Geometry Shader, or (2) returning from the EndPrimitive( ) call. Note: there is no need to call EndPrimitive( ) at the end of the Geometry Shader it is implied.

If you are using a Geometry Shader, then the GS must be used if you want to pass information from the Vertex Shader to the Fragment Shader 11 V G F out vec4 gl_position; out vec4 vcolor; vcolor = gl_color; These are already declared for you in vec4 gl_positionin[3]; in vec4 vcolor[3]; out vec4 gl_position; out vec4 gcolor; gcolor = vcolor[ k ]; in vec4 gcolor; Primitive Assembly gl_position = gl_positionin[0]; gcolor = vcolor[0]; EmitVertex( );... Primitive Assembly Rasterizer

Example: A Bézier Curve 12 P 1 P 2 P 0 P 3 Pu ( ) (1 u) P 3 u(1 u) P 3 u(1 up ) up 3 2 2 3 0 1 2 3

Example: Expanding 4 Points into a Bezier Curve with a Variable Number of Line Segments 13 bezier.urve.glib Vertex beziercurve.vert Geometry beziercurve.geom Fragment beziercurve.frag Program BezierCurve unum <2 4 50> LineWidth 3. LinesAdjacency [0. 0. 0.] [1. 1. 1.] [2. 1. 2.] [3. -1. 0.] beziercurve.vert void main( ) gl_position = gl_modelviewprojectionmatrix * gl_vertex; beziercurve.frag void main( ) gl_fragcolor = vec4( 0., 1., 0., 1. );

Example: Expanding 4 Points into a Bezier Curve with a Variable Number of Line Segments beziercurve.geom #version 330 compatibility #extension GL_EXT_gpu_shader4: enable #extension GL_EXT_geometry_shader4: enable layout( lines_adjacency ) in; layout( line_strip, max_vertices=200 ) out; uniform int unum; void main( ) float dt = 1. / float(unum); float t = 0.; for( int i = 0; i <= unum; i++ ) float omt = 1. - t; float omt2 = omt * omt; float omt3 = omt * omt2; float t2 = t * t; float t3 = t * t2; vec4 xyzw = omt3 * gl_positionin[0].xyzw + 3. * t * omt2 * gl_positionin[1].xyzw + 3. * t2 * omt * gl_positionin[2].xyzw + t3 * gl_positionin[3].xyzw; Note: these are used to define the storage 14 Computer Graphics gl_position = xyzw; EmitVertex( ) t += dt;

Example: Expanding 4 Points into a Bezier Curve with a Variable Number of Line Segments 15 unum = 5 unum = 25

Note: It would have made no Difference if the Matrix Transform had been done in the Geometry Shader Instead 16 beziercurve.vert void main( ) gl_position = gl_vertex; beziercurve.geom... vec4 xyzw = omt3 * gl_positionin[0].xyzw + 3. * t * omt2 * gl_positionin[1].xyzw + 3. * t2 * omt * gl_positionin[2].xyzw + t3 * gl_positionin[3].xyzw; gl_position = gl_modelviewprojectionmatrix * xyzw; EmitVertex( ) t += dt;

Another Example: Shrinking Triangles 17

Example: Shrinking Triangles 18 P 2 Centroid = CG P 0 P 1 CG = ( P 0 + P 1 + P2 ) / 3.; P 0 = CG + ushrink * ( P 0 -CG ) P 1 = CG + ushrink * ( P 1 -CG ) P 2 = CG + ushrink * ( P 2 -CG )

shrink.geom #version 330 compatibility #extension GL_EXT_gpu_shader4: enable #extension GL_EXT_geometry_shader4: enable layout( triangles ) in; layout( triangle_strip, max_vertices=200 ) out; 19 uniform float ushrink; in vec3 vnormal[3]; out float glightintensity; const vec3 LIGHTPOS = vec3( 0., 10., 0. ); vec3 V[3]; vec3 CG; void ProduceVertex( int v ) g LightIntensity = dot( normalize(lightpos- V[v]), vnormal[v] ); g LightIntensity = abs( glightintensity ); gl_position = gl_modelviewprojectionmatrix * vec4( CG + ushrink * ( V[v] - CG ), 1. ); EmitVertex( ); void main( ) V[0] = gl_positionin[0].xyz; V[1] = gl_positionin[1].xyz; V[2] = gl_positionin[2].xyz; CG = ( V[0] + V[1] + V[2] ) / 3.; ProduceVertex( 0 ); ProduceVertex( 1 ); ProduceVertex( 2 );

Another Example: Sphere Subdivision 20 It s often useful to be able to parameterize a triangle into (s,t), like this: V2 (1,0) T (0,0) V0 T=0 S (0,1) V1 V(s,t) = V0 + s*(v1-v0) + t*(v2-v0)

Example: Sphere Subdivision 21 V2 V2 V2 V0 ulevel = 0 numlayers = 2 level = 1 V1 V0 ulevel = 1 numlayers = 2 V1 V0 ulevel = 2 numlayers = 4 V1

Example: Sphere Subdivision 22 spheresubd.glib Vertex spheresubd.vert Geometry spheresubd.geom Fragment spheresubd.frag Program SphereSubd ulevel <0 0 10> uradius <.5 1. 5.> ucolor 1..5.15 1. Triangles [ 0. 0. 1.] [ 1. 0. 0.] [0. 1. 0.] Triangles [ 1. 0. 0.] [ 0. 0. -1.] [0. 1. 0.] Triangles [ 0. 0. -1.] [-1. 0. 0.] [0. 1. 0.] Triangles [-1. 0. 0.] [ 0. 0. 1.] [0. 1. 0.] Triangles [ 0. 0. 1.] [ 1. 0. 0.] [0. -1. 0.] Triangles [ 1. 0. 0.] [ 0. 0. -1.] [0. -1. 0.] Triangles [ 0. 0. -1.] [-1. 0. 0.] [0. -1. 0.] Triangles [-1. 0. 0.] [ 0. 0. 1.] [0. -1. 0.]

Example: Sphere Subdivision 23 spheresubd.vert void main( ) gl_position = gl_vertex; spheresubd.frag uniform vec4 ucolor; in float glightintensity; void main( ) gl_fragcolor = vec4( glightintensity*ucolor.rgb, 1. );

spheresubd.geom #version 330 compatibility #extension GL_EXT_gpu_shader4: enable #extension GL_EXT_geometry_shader4: enable layout( triangles ) in; layout( triangle_strip, max_vertices=200 ) out; Example: Sphere Subdivision 24 uniform int ulevel; uniform float uradius; out float glightintensity; const vec3 LIGHTPOS = vec3( 0., 10., 0. ); vec3 V0, V01, V02; void ProduceVertex( float s, float t ) vec3 v = V0 + s*v01 + t*v02; v = normalize(v); vec3 n = v; vec3 tnorm = normalize( unormalmatrix * n ); // the transformed normal vec4 ECposition = gl_modelviewmatrix * vec4( (uradius*v), 1. ); glightintensity = abs( dot( normalize(lightpos - ECposition.xyz), tnorm ) ); gl_position = gl_projectionmatrix * ECposition; EmitVertex( );

spheresubd.geom Example: Sphere Subdivision 25 void main( ) V01 = ( gl_positionin[1] - gl_positionin[0] ).xyz; V02 = ( gl_positionin[2] - gl_positionin[0] ).xyz; V0 = gl_positionin[0].xyz; int numlayers = 1 << ulevel; float dt = 1. / float( numlayers ); float t_top = 1.; for( int it = 0; it < numlayers; it++ )...

spheresubd.geom for( int it = 0; it < numlayers; it++ ) float t_bot = t_top - dt; float smax_top = 1. - t_top; float smax_bot = 1. - t_bot; Example: Sphere Subdivision 26 int nums = it + 1; float ds_top = smax_top / float( nums - 1 ); float ds_bot = smax_bot / float( nums ); float s_top = 0.; float s_bot = 0.; for( int is = 0; is < nums; is++ ) ProduceVertex( s_bot, t_bot ); ProduceVertex( s_top, t_top ); s_top += ds_top; s_bot += ds_bot; ProduceVertex( s_bot, t_bot ); EndPrimitive( ); t_top = t_bot; t_bot -= dt; Computer Graphics

Level = 0 Example: Sphere Subdivision with One triangle 27 Level = 1 Level = 3 Level = 2

Example: Sphere Subdivision with the Whole Sphere (8 triangles) Level = 0 28 Level = 1 Level = 3 Level = 2

V2 Another Example: Explosion Time 29 V0 Level = 2 numlayers = 4 V1 Time Time 1. Break the triangles into points 2. Treat each point s distance from the triangle s CG as an initial velocity 3. Follow the laws of projectile motion: x x v t 0 1 y y0 vyt ayt 2 x 2

Example: Explosion 30 explode.geom #version 330 compatibility #extension GL_EXT_gpu_shader4: enable #extension GL_EXT_geometry_shader4: enable layout( triangles ) in; layout( points, max_vertices=200 ) out; uniform int ulevel; uniform float ugravity; uniform float utime; uniform float uvelscale; vec3 V0, V01, V02; vec3 CG; void ProduceVertex( float s, float t ) vec3 v = V0 + s*v01 + t*v02; vec3 vel = uvelscale * ( v - CG ); v = CG + vel*utime + 0.5*vec3(0.,uGravity,0.)*uTime*uTime; gl_position = gl_projectionmatrix * vec4( v, 1. ); EmitVertex( );

explode.geom Example: Explosion void main( ) V01 = ( gl_positionin[1] - gl_positionin[0] ).xyz; V02 = ( gl_positionin[2] - gl_positionin[0] ).xyz; V0 = gl_positionin[0].xyz; CG = ( gl_positionin[0].xyz + gl_positionin[1].xyz + gl_positionin[2].xyz ) / 3.; 31 int numlayers = 1 << ulevel; float dt = 1. / float( numlayers ); float t = 1.; for( int it = 0; it <= numlayers; it++ ) float smax = 1. - t; int nums = it + 1; float ds = smax / float( nums - 1 ); float s = 0.; for( int is = 0; is < nums; is++ ) ProduceVertex( s, t ); s += ds; t -= dt;

Example: Explosion 32

Another Example: Silhouettes 33 2 1 3 0 4 5 1. Compute the normals of each of the four triangles 2. If there is a sign difference between the z component of the center triangle and the z component of an adjacent triangle, draw their common edge

Example: Silhouettes 34 silh.glib Obj bunny.obj Vertex silh.vert Geometry silh.geom Fragment silh.frag Program Silhouette ucolor 0. 1. 0. 1. ObjAdj bunny.obj

Example: Silhouettes 35 silh.vert void main( ) gl_position = gl_modelviewmatrix * gl_vertex; silh.frag uniform vec4 ucolor; void main( ) gl_fragcolor = vec4( ucolor.rgb, 1. );

silh.geom Example: Silhouettes 36 #version 330 compatibility #extension GL_EXT_gpu_shader4: enable #extension GL_EXT_geometry_shader4: enable layout( triangles_adjacency ) in; layout( line_strip, max_vertices=200 ) out; void main( ) vec3 V0 = gl_positionin[0].xyz; vec3 V1 = gl_positionin[1].xyz; vec3 V2 = gl_positionin[2].xyz; vec3 V3 = gl_positionin[3].xyz; vec3 V4 = gl_positionin[4].xyz; vec3 V5 = gl_positionin[5].xyz; 1 2 0 4 5 3 vec3 N042 = cross( V4-V0, V2-V0 ); vec3 N021 = cross( V2-V0, V1-V0 ); vec3 N243 = cross( V4-V2, V3-V2 ); vec3 N405 = cross( V0-V4, V5-V4 ); if( dot( N042, N021 ) < 0. ) N021 = vec3(0.,0.,0.) - N021; // the center triangle s normal // make sure each outer triangle s // normal is in the same general direction if( dot( N042, N243 ) < 0. ) N243 = vec3(0.,0.,0.) - N243; if( dot( N042, N405 ) < 0. ) N405 = vec3(0.,0.,0.) - N405;

silh.geom Example: Silhouettes 37 if( N042.z * N021.z <= 0. ) gl_position = gl_projectionmatrix * vec4( V0, 1. ); EmitVertex( ); gl_position = gl_projectionmatrix * vec4( V2, 1. ); EmitVertex( ); EndPrimitive( ); 1 2 3 if( N042.z * N243.z <= 0. ) gl_position = gl_projectionmatrix * vec4( V2, 1. ); EmitVertex( ); gl_position = gl_projectionmatrix * vec4( V4, 1. ); EmitVertex( ); EndPrimitive( ); 0 4 5 if( N042.z * N405.z <= 0. ) gl_position = gl_projectionmatrix * vec4( V4, 1. ); EmitVertex( ); gl_position = gl_projectionmatrix * vec4( V0, 1. ); EmitVertex( ); EndPrimitive( ); Computer Graphics

Example: Bunny Silhouettes 38

Another Example: Hedgehog Plots 39

hedgehog.geom, I 40 #version 330 compatibility #extension GL_EXT_gpu_shader4: enable #extension GL_EXT_geometry_shader4: enable layout( triangles ) in; layout( line_strip, max_vertices=200 ) out; uniform int udetail; uniform float udroop; uniform int ulength; uniform float ustep; in vec3 vtnorm[3]; in vec4 vcolor[3]; out vec4 gcolor; int ILength; vec3 Norm[3]; vec3 N0, N01, N02; vec4 V0, V01, V02; void ProduceVertices( float s, float t ) vec4 v = V0 + s*v01 + t*v02; vec3 n = normalize( N0 + s*n01 + t*n02 ); for( int i = 0; i <= ulength; i++ ) gl_position = gl_projectionmatrix * v; gcolor = vcolor[0]; EmitVertex( ); v.xyz += ustep * n; v.y -= udroop * float(i*i); EndPrimitive( );

hedgehog.geom, II 41 void main( ) V0 = gl_positionin[0]; V01 = ( gl_positionin[1] - gl_positionin[0] ); V02 = ( gl_positionin[2] - gl_positionin[0] ); Norm[0] = vtnorm[0]; Norm[1] = vtnorm[1]; Norm[2] = vtnorm[2]; if( dot( Norm[0], Norm[1] ) < 0. ) Norm[1] = -Norm[1]; if( dot( Norm[0], Norm[2] ) < 0. ) Norm[2] = -Norm[2]; N0 = normalize( Norm[0] ); N01 = normalize( Norm[1] - Norm[0] ); N02 = normalize( Norm[2] - Norm[0] ); int numlayers = 1 << udetail;

hedgehog.geom, III 42 float dt = 1. / float( numlayers ); float t = 1.; for( int it = 0; it <= numlayers; it++ ) float smax = 1. - t; int nums = it + 1; float ds = smax / float( nums - 1 ); float s = 0.; for( int is = 0; is < nums; is++ ) ProduceVertices( s, t ); s += ds; t -= dt;

Ducky Hedgehog Plot 43

Hedgehog Plots Gone Wild 44

45 A GLSL Built-in Variable for the Geometry Shaders int gl_primitiveidin Tells the number of primitives processed since the last time glbegin( ) was called Calling a vertex array function counts as an implied glbegin( ) gl_primitiveidin is 0 for the first primitive after the glbegin( ) Geometry shaders can set the built-in variable gl_primitiveid to send a primitive number to the fragment shader

What Happens if you Exceed the Maximum Allowed Emitted Vertices? 46 New in GLSL 4.x you can loop back through the Geometry Shader multiple times