Physically-Accurate Fur Reflectance: Modeling, Measurement and Rendering

1. Measured Raw Reflectance data

Each link is a .txt file containing lines in the following format:

phi theta value

where theta and phi are longitudinal and azimuthal incident angles, respectively. Note that, both theta and phi are using coordinates of the gantry, where theta in [40, 80] maps to [50, 10] degrees and phi in [70, 290] maps to [-20, 200] degrees, following the notations in our paper. If a value cannot be measured, it shows '?'.

The plots show logarithm values.

Bobcat Cat
Deer Dog
Human Mouse
Raccoon Sprningbok
Rabbit

2. Precomputed Scattering Profiles CN and CM

Both CN and CM are 1D profiles for 3D sets of parameters, so they are essentially 4D tables. We provide the accurate pre-computed data without compression here:

Download (620 MB)

Here is a code snippet showing how to read the scattering profiles. Should be very easy to understand.

// Number of bins
#define NUM_SCATTERING_INNER 64
#define NUM_H 64
#define NUM_THETA 64
#define NUM_G 16
#define NUM_BINS 720

// Storage
float scattered[NUM_SCATTERING_INNER][NUM_H][NUM_G][NUM_BINS];
float scatteredDist[NUM_SCATTERING_INNER][NUM_H][NUM_G][NUM_BINS];
float scatteredM[NUM_SCATTERING_INNER][NUM_THETA][NUM_G][NUM_BINS];
float integratedM[NUM_SCATTERING_INNER][NUM_THETA][NUM_G][NUM_BINS];

void initialize(const char *medullaFilename) {
    // Read precomputed medulla profiles (azimuthal)
    FILE *fMedullaN = fopen((std::string(medullaFilename) + "_azimuthal.bin").c_str(), "rb");
    fread(scattered, sizeof(float), NUM_SCATTERING_INNER * NUM_H * NUM_G * NUM_BINS, fMedullaN);
    fread(scatteredDist, sizeof(float), NUM_SCATTERING_INNER * NUM_H * NUM_G * NUM_BINS, fMedullaN);
    fclose(fMedullaN);

    // Read precomputed medulla profiles (longitudinal)
    FILE *fMedullaM = fopen((std::string(medullaFilename) + "_longitudinal.bin").c_str(), "rb");
    fread(scatteredM, sizeof(float), NUM_SCATTERING_INNER * NUM_THETA * NUM_G * NUM_BINS, fMedullaM);
    fread(integratedM, sizeof(float), NUM_SCATTERING_INNER * NUM_THETA * NUM_G * NUM_BINS, fMedullaM);
    fclose(fMedullaM);
}