The triangles output by the SurfaceModeller have attributes attached with their slope and aspect information. We can use this information to calculate a surface normal for each triangle and compare this to a user supplied light vector to create an illumination value, using the following calculations:

Slope_rad = SurfaceModel.slope * pi / 180.0
Aspect_rad = SurfaceModel.aspect * pi / 180.0
Azimuth_rad = (fmod((360.0 - Light_Azimuth + 90),360.0) )* pi /180.0
Zenith_rad = (90.0 - Light_Altitude) * pi /180.0

Illumination = (cos(Zenith_rad)*cos(Slope_rad))+(sin(Zenith_rad)*sin(Slope_rad)*cos(Azimuth_rad-Aspect_rad))

The Illumination value is used to set the color of the triangle, then the triangles can be rendered to raster using an ImageRasterizer transformer. The result is a greyscale shading of the surface.

An annotated workspace to illustrate this process in greater detail is attached, along with some source DEM data. The workspace allows the user to set the light source elevation and azimuth angles, and to control the resolution of the output GeoTIFF.