Effcient Acquisition and Realistic Rendering of Car Paint

Johannes Günther, Tongbo Chen, Michael Goesele, Ingo Wald, and Hans-Peter Seidel

Teaser 1 Teaser 2 Teaser 3 Teaser 4

Abstract

The outside appearance of cars is mostly defined through only two distinct materials – glass and car paint. While glass can rather easily be simulated by the simple physical laws of reflection and refraction, modelling car paint is more challenging.

In this paper we present a framework for the efficient acquisition and realistic rendering of real-world car paint. This is achieved by building an easy-to-reproduce measuring setup, fitting the measured data to a general BRDF model for car paint, adding a component for simulating the sparkling effect of metallic paints, and rendering using a specially designed shader in a realtime ray tracer.

Paper

PDF
[pdf]
[bib]
VMV 2005
9 pages
8233 kb

bibtex entry
    PPT
[ppt]
Slides
9318 kb

BRDF Data

Here we provide our measured BRDF data sets.

Licence

You may download and use the data only for non-commercial and research purposes!

Format description

The 3-dimensional BRDF is stored using the halfway vector based parameterization (see Section 4.1 in the paper for details). φd is split into 180 bins, while θh and θd are subdivided into 90 bins. The order of the dimensions is φd, θh, θd. Each table entry consists of 3 float values, representing the red, green and blue channel.
This is more or less the raw measured data. The BRDF values are not normalized (there can be values grater than 1.0) and no color calibration has been done. Invalid values are marked with -1.0.

Example code

#include <fstream>
using namespace std;

typedef struct {
  float r, g, b;
} Color;

const unsigned THETA = 90;
const unsigned PHI = 180;
Color *data = new Color[THETA * THETA * PHI];
    
ifstream file("brdf_data");
// skip header
file.seekg(84);

Color col;
for (unsigned phi_d = 0; phi_d < PHI; phi_d++)
  for (unsigned theta_h = 0; theta_h < THETA; theta_h++)
    for (unsigned theta_d = 0; theta_d < THETA; theta_d++) {
      fread(&col, sizeof(Color), 1, file);
      // now a different order of the dimensions can be used
      data[(theta_h * THETA + theta_d) * PHI + phi_d] = col;
    }

Data sets


white [gz][zip]

2k_acrylack [gz][zip]

blue [gz][zip]

blue_matte [gz][zip]

ford_f8 [gz][zip]

BMW339 [gz][zip]

OPEL_titan [gz][zip]

polaris_silver [gz][zip]

all sets [tar.gz][zip]
8 data sets
58 Mb
 

Videos

carpaint.avi 640 × 480, 25 fps, 5 sec, MPEG4 (xvid), 7840 kb


sparkles.avi 640 × 480, 25 fps, 5 sec, MPEG4, 4112 kb


Images

back_hq.png 1280 × 960, 1296 kb


pos1.jpg 4640 × 1920, 1208 kb

pos1.png 4640 × 1920, 8244 kb


pos2.jpg 4640 × 1920, 1064 kb

pos2.png 4640 × 1920, 6768 kb


pos3.jpg 4640 × 1920, 648 kb

pos3.png 4640 × 1920, 5292 kb


2k_acrylack.png 640 × 480, 368 kb


BMW339.png 640 × 480, 384 kb


OPEL_titan.png 640 × 480, 384 kb


blue.png 640 × 480, 392 kb


blue_matte.png 640 × 480, 384 kb


ford_f8.png 640 × 480, 384 kb


polaris_silver.png 640 × 480, 384 kb


white.png 640 × 480, 376 kb


door_glossy.png 640 × 480, 276 kb


side.png 640 × 480, 364 kb


sparkles.png 640 × 480, 908 kb