From Blinn: Models of Light Reflection for Computer Synthesized Pictures, Siggraph '77.
indexOfRefraction: REAL ~ 200.0;
specularCharacteristic: REAL ~ 0.35;
r, rSubQ, rAddQ, qrAddQ, qrSubQ, q: REAL;
light.position ¬ G3dVector.Unit[light.position]; -- keep to unit sphere, for user interaction
light.direction ¬ G3dVector.Unit[light.direction];
light.highlight ¬ G3dVector.Unit[G3dVector.Add[eyeView, light.direction]];
q ¬ light.eDotH ¬ G3dVector.Dot[eyeView, light.direction];
r ¬ RealFns.SqRt[indexOfRefraction*indexOfRefraction+q*q-1.0];
rSubQ ¬ r-light.eDotH;
rAddQ ¬ r+light.eDotH;
qrAddQ ¬ light.eDotH*rAddQ-1.0;
qrSubQ ¬ light.eDotH*rSubQ+1.0;
light.f ¬ ((rSubQ*rSubQ)/(rAddQ*rAddQ))*(1.0+(qrAddQ*qrAddQ)/(qrSubQ*qrSubQ));
light.a ¬ 1.0/(specularCharacteristic*specularCharacteristic-1.0);
light.b ¬ light.a+1.0;
IF light.lightProc = NIL THEN light.lightProc ¬ DefaultIllumination;