//pref
Diffuse|float|0.0|0.5|1.4
DiffuseRough|float|0.1|1|5
Edge|float|0.0|0.5|1.4
EdgeRough|float|0.1|1|5
Two illumination sources: from camera position and light position.|note
//vert
#version 330
layout(location = 0) in vec3 Vert;
layout(location = 3) in vec3 Norm;
layout(location = 6) in vec4 Clr;
out vec3 vN, vL, vV;
out vec4 vClr, vP;
uniform mat4 ModelViewProjectionMatrix;
uniform mat4 ModelViewMatrix;
uniform mat3 NormalMatrix;
uniform vec3 LightPos = vec3(0.0, 20.0, 30.0); //LR, -DU+, -FN+
void main() {
    vN = normalize((NormalMatrix * Norm));
    vP = vec4(Vert, 1.0);
    gl_Position = ModelViewProjectionMatrix * vec4(Vert, 1.0);
    vL = normalize(LightPos);
    vV = -vec3(ModelViewMatrix*vec4(Vert,1.0));
    vClr = Clr;
}
//frag
#version 330
in vec4 vClr, vP;
in vec3 vN, vL, vV;
out vec4 color;
uniform float Diffuse = 0.5;
uniform float DiffuseRough = 1.0;
uniform float Edge = 0.5;
uniform float EdgeRough = 1.0;
uniform vec4 ClipPlane = vec4(2.0, 0.0, 0.0, 0.0);
void main() {
	if ((ClipPlane[0] < 1.5) && (dot( ClipPlane, vP) > 0.0)) discard;
	vec3 n = normalize(vN);
	float e = pow(max(dot(normalize(vV), n), 0.0), EdgeRough) * Edge; //surface angle with respect to viewer location
	float d = pow(max(dot(normalize(vL), n), 0.0), DiffuseRough) * Diffuse; //surface angle with respect to light source location
	color = vec4((e + d) * vClr.rgb, 1.0);
}