How to obtain the correct picking result after morph application?

What do you mean by “boundary case”? Is it when the samples used to calculate the normal are not from the same object? If so, the link I gave above (Improved normal reconstruction from depth – Wicked Engine) addresses this problem.

Also, everything can be simplified if you use the geometry buffer renderer to render the normals directly into a render texture. This way you don’t need to calculate the normal, you just read it from the texture:

This example uses the geometry buffer position texture to get the 3D position of the pixel you clicked on the screen (search for gbr). You can easily get the normal by querying gbr.getGBuffer().textures[1]. And the depth can be retrieved by gbr.getGBuffer().textures[0].