How does one go about taking a single photograph, like a picture of a rock wall, and getting a decent normal map out of it?

If you can, I'd like to learn about the mechanics behind it, and not a piece of software like CrazyBump that does it for me.

  • $\begingroup$ Any reason you're limiting yourself to a single texture? I've seen it done with multiple textures in shipping apps. (Not to say it can't be done with a single texture, but my guess is that it's easier with more than 1 texture.) $\endgroup$ – user1118321 Jun 15 '17 at 1:44
  • $\begingroup$ It's easier to get a single texture. And, I'm curious :) $\endgroup$ – Daniel Kareh Jun 15 '17 at 2:34
  • $\begingroup$ @DanielKareh: "But how does one go about taking a single texture and getting a decent normal map out of it?" What makes you think that there's a way to convert an image into a normal map? What is the image of, exactly? $\endgroup$ – Nicol Bolas Jun 15 '17 at 2:42
  • $\begingroup$ try reading this: fenix.tecnico.ulisboa.pt/downloadFile/845043405449073/… $\endgroup$ – Charlie Jun 15 '17 at 5:47
  • $\begingroup$ @NicolBolas: Well, software like CrazyBump seems capable of generating normal maps of many, many surfaces from a single texture. $\endgroup$ – Daniel Kareh Jun 15 '17 at 13:05

"decent" is quite subjective and if you are restricting the capture to certain types of surfaces and controlled lighting conditions. For example normals and other SVBRDF parameters for shiny metallic surfaces are very difficult to capture compared to non-metallic, matte and bright surfaces without texture.

There are tools proposed in comments (CrazyBump, AwesomeBump) that try to do what you ask for and may generate normal maps sufficient to your requirements, but you could argue how "decent" the results are and how robust these tools are in capturing different types of surfaces. I don't know about the algorithms these tools use, but I believe they use more of an "artistic" than robust/accurate methods in generating the results.

There is some recent work to estimate normal map and other SVBRDF parameters using two images or from a single image (using neural networks), which is probably your best bet. However these algorithms assume a level of repeating pattern in the input images, but this might be ok for you since you mention rock wall as an example. There are likely other constraints as well such as requiring the captured surface to be dielectric hard surface material.

For more robust SVBRDF capturing you can check paper on frequency domain capture, but this is more complex capturing setup and far from a single image capture. enter image description here

To my knowledge there's no known generic algorithm to accurately extract SVBRDF parameters from a single image of a non-repeating surface because of the fundamental issue that a single image can't unambiguously represent SVBRDF parameters. E.g. two different normal & albedo combinations of a Lambertian surface may result in same pixel color in a single image.

  • $\begingroup$ I'll make sure to check out the mentioned neural network approach. I guess I'll have to go back to messing around with custom image filters, considering you mentioned that those applications use artistic approaches rather than super accurate models of light transfer. $\endgroup$ – Daniel Kareh Jun 17 '17 at 16:09

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.