--- /dev/null
+import postprocess;
+
+uniform Vignette
+{
+ vec2 coord_scale;
+ vec4 optical;
+ vec2 optical_range;
+ float natural;
+};
+
+#pragma MSP stage(fragment)
+void main()
+{
+ vec4 incoming = texture(source, texcoord);
+ vec2 r = vertex.xy*coord_scale;
+ float r_sq = dot(r, r);
+
+ float vignette = 1.0;
+ if(r_sq>=optical_range.y)
+ vignette = 0.0;
+ else if(r_sq>=optical_range.x)
+ {
+ float r = sqrt(r_sq)-optical.x;
+ float v = (optical.z*acos(r/optical.y)-sqrt(optical.z-r*r)*r);
+ vignette = v/optical.w;
+ }
+
+ float c_sq = 1/(1+r_sq*natural);
+ vignette *= c_sq*c_sq;
+
+ frag_color = vec4(incoming.rgb*vignette, incoming.a);
+}