Graphics Reference
In-Depth Information
layout( triangles_adjacency ) in;
layout( line_strip, max_vertices=32 ) 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;
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 );
// rashly assume all 4 normals are really meant to be
// within 90 degrees of each other:
if( dot( N042, N021 ) < 0. )
N021 = -N021;
if( dot( N042, N243 ) < 0. )
N243 = -N243;
if( dot( N042, N405 ) < 0. )
N405 = -N405;
// look for a silhouette edge between triangles 042 and
// 021:
if( N042.z * N021.z < 0. )
{
gl_Position = uProjectionMatrix* vec4( V0, 1. );
EmitVertex( );
gl_Position = uProjectionMatrix* vec4( V2, 1. );
EmitVertex( );
EndPrimitive( );
}
// look for a silhouette edge between triangles 042 and
// 243:
if( N042.z * N243.z < 0. )
{
gl_Position= uProjectionMatrix* vec4( V2, 1. );
EmitVertex( );
Search WWH ::




Custom Search