//pref
Ambient|float|0.0|0.5|1
Diffuse|float|0.0|0.7|1
Specular|float|0.0|0.2|1
Shininess|float|1|60|120
GapSize|float|0.0|0.5|1.0
BackfaceType|int|0|2|2
Disks|bool|true
Make gaps. Copyright 2018 Chris Rorden, BSD2clause.|note
//geom
#version 120
#extension GL_EXT_geometry_shader4 : enable

//Intel OpenGL 4.20 Build 10.18.10.3496 on Windows 8.1 does not correctly implement
// early geometry shaders. Works fine on NVidia GPU on same setup (hybrid laptop) and with
// Intel drivers that come with OSX.

//#define INTELBUG // <- ENALBE THIS LINE TO WORK WITH BORKED INTEL DRIVERS
#ifdef INTELBUG
in vec3 vL[3];   //[3] because this makes a triangle
in vec3 vN[3];
in vec3 vV[3];
in vec4 vP[3];
in vec4 vClr[3];
out vec3 gE; //Edge value
out vec3 gL;
out vec3 gN;
out vec3 gV;
out vec4 gP;
out vec4 gClr;
#else
varying in vec3 vL[3];   //[3] because this makes a triangle
varying in vec3 vN[3];
varying in vec3 vV[3];
varying in vec4 vP[3];
varying in vec4 vClr[3];
varying out vec3 gE; //Edge value
varying out vec3 gL;
varying out vec3 gN;
varying out vec3 gV;
varying out vec4 gP;
varying out vec4 gClr;
#endif
void main(void) {
    //for(int i=0; i < gl_VerticesIn; i++) { //Intel Bug
    for(int i=0; i < 3; i++) {
    	gl_Position = gl_PositionIn[i];
    	if (i == 0)
    		gE = vec3(1.0, 0.0, 0.0);
    	else if (i == 1)
    		gE = vec3(0.0, 1.0, 0.0);
    	else
    		gE = vec3(0.0, 0.0, 1.0);
    	gL = vL[i];
    	gN = vN[i];
    	gV = vV[i];
    	gP = vP[i];
    	gClr = vClr[i];
        EmitVertex();
    }
    EndPrimitive();
}
//frag
uniform float Ambient, Diffuse, Specular, Shininess, GapSize;
uniform int BackfaceType;
uniform bool Disks;
uniform vec4 ClipPlane;
varying vec3 gE, gL, gN, gV;
varying vec4 gP, gClr;

void main() {
	if ((ClipPlane[0] < 1.5) && (dot( ClipPlane, gP) > 0.0)) discard;

	vec3 n = normalize(gN);
	float backface = step(0.0, n.z); //1=backface
	if ((BackfaceType == 0) && (backface < 0.5)) discard;
	float e = mix( ((1.0-min(min(gE.x, gE.y), gE.z))-0.67) * 3.0 ,pow( max(length(gE)-0.59,0.0) * 2.4, 0.5), float(Disks));
	float sz = GapSize;
	if ((backface > 0.5) && (e > sz))  discard;
	if ((BackfaceType == 1) && (e > sz))  discard;

	vec3 l = normalize(gL);
	vec3 h = normalize(l+normalize(gV));
	vec3 a = gClr.rgb * Ambient;
	vec3 d = gClr.rgb * Diffuse;
	float diff = dot(n,l);
	float spec = pow(max(0.0,dot(n,h)), Shininess);
	vec3 backcolor = Ambient*vec3(0.1+0.1+0.1) + d*abs(diff);
	vec4 face = vec4(mix(backcolor.rgb, a + d*diff + spec*Specular,  backface), 1.0);
	gl_FragColor = face;
}
