In computer graphics, a silhouette edge on a 3D body projected onto a 2D plane (display plane) is the collection of points whose outwards surface normal is perpendicular to the view vector. Due to discontinuities in the surface normal, a silhouette edge is also an edge which separates a front facing face from a back facing face. Without loss of generality, this edge is usually chosen to be the closest one on a face, so that in parallel view this edge corresponds to the same one in a perspective view. Hence, if there is an edge between a front facing face and a side facing face, and another edge between a side facing face and back facing face, the closer one is chosen. The easy example is looking at a cube in the direction where the face normal is collinear with the view vector.
The first type of silhouette edge is sometimes troublesome to handle because it does not necessarily correspond to a physical edge in the CAD model. The reason that this can be an issue is that a programmer might corrupt the original model by introducing the new silhouette edge into the problem. Also, given that the edge strongly depends upon the orientation of the model and view vector, this can introduce numerical instabilities into the algorithm (such as when a trick like dilution of precision is considered).
To determine the silhouette edge of an object, we first have to know the plane equation of all faces. Then, by examining the sign of the point-plane distance from the light-source to each face
ax+by+cz+d=\begin{cases}>0&frontfacing\ =0¶llel\ <0&backfacing\end{cases}
The silhouette edge(s) consist of all edges separating a front facing face from a back facing face.
A convenient and practical implementation of front/back facing detection is to use the unit normal of the plane (which is commonly precomputed for lighting effects anyway), then simply applying the dot product of the light position to the plane's unit normal and adding the D component of the plane equation (a scalar value):
bf{normal} ⋅ (bf{lightposition})+planeD=\langlea,b,c,d\rangle ⋅ \langleLx,Ly,Lz,Lw\rangle+planeD
aLx+bLy+cLz+dLw+planeD=indicator
Where plane_D is easily calculated as a point on the plane dot product with the unit normal of the plane:
planeD=PointOnPlane ⋅ (bf{normal})
Note: The homogeneous coordinates, L_w and d, are not always needed for this computation.
After doing this calculation, you may notice indicator is actually the signed distance from the plane to the light position. This distance indicator will be negative if it is behind the face, and positive if it is in front of the face.
indicator=\begin{cases}>0&front-facing\ =0¶llel\ <0&back-facing\end{cases}
This is also the technique used in the 2002 SIGGRAPH paper, "Practical and Robust Stenciled Shadow Volumes for Hardware-Accelerated Rendering"