Niklas Hauber has built an impressively-capable material scanner — after building a CNC router and a spectrometer, two tools he declared “absolutely necessary” for the project, along the way — in an effort to be able to more accurately represent real-world items in 3D rendering engines, including games.
“For the last one and a half years I’ve been developing my material scanner in my spare time. The goal of this scanner is to be able to calculate the visual properties of a material,” Hauber explains. “These properties then allow me to render images of the same material under different lighting conditions. So a typical application would be computer games for example.”
The key focus of Hauber’s work: the ability to put any material underneath the scanner and capture its albedo, a normal map, specularity, and how metallic or rough it is — using a bidirectional reflectance distribution function (BDRF) to turn real-world captures into representations of the material under any lighting conditions in a 3D rendering engine.
The scanner Hauber has created is a bit of a beast, featuring 63 white LEDs and eight programmable color LEDs with a 16-megapixel monochrome camera and a motorized linear polarizer. “This allows me to separate the specular and diffuse reflections,” Hauber explains. “For switching the LEDs on and off I’ve designed some simple PCBs which are basically just daisy chained shift registers connected to MOSFETs. The scanner is capable of taking 11 images per second, but this is mainly limited by my camera, which is an ASI 1600MM Pro that I normally use for astrophotography.”
Recent work on the project has resulted in the ability to calculate height maps, and create 3D models, from the captured 2D images. (: Niklas Hauber)
On the software side, Hauber has developed “pretty much all of the software for acquisition, solving, and visualizing” — coding primarily in C and C++, using NVIDIA’s CUDA to leverage general-purpose GPU (GPGPU) acceleration to speed up the solving process, and Microsoft’s DirectX for visualizing the results. Most recently, Hauber added the ability to calculate a height map from the scanner’s normal map — creating a 3D model from 2D image data.
More information on the scanner project is available on Hauber’s blog; design files and source code have not been made publicly available.