There are some excellent solutions to surface-reconstuction using Kinect, such as Kinect Fusion, however I was still keen to understand the feasibility of extracting a basic normal map from depth data.
In order to determine the normal vector for a given depth pixel, I simply sample surrounding pixels and look at the local surface gradient. However, as depth values are stepped, for small sample areas and particularly at larger depth values, this will result in a lot of forward-facing normals from the surfaces of the depth "planes", as shown below in Figure 1. Using a larger sample size improves things significantly, as shown in the second image.
The normal map then enables the point cloud to be rendered using directional lighting, as shown below in Figure 3.
Note that the images above are still rendered as point clouds, rather than a surface mesh.