Color conversions

F15213bd1bee350b83c3a2e5f9748b13
0
flux00 101 Aug 13, 2009 at 02:45

Yo devs,

I’m writing an application to create and manipulate spectral power distributions (the physical basis of color). What I have thus far is kinda cool, you can click on the either of the spectrums on the left and it’ll give you an spd (a gaussian distribution for the color spectrum and plank’s formula for the blackbody spectrum).

The problem is the results are inaccurate, and I don’t have any papers on the subject I can mimick…

Untitled-3.jpg

The steps I’m taking to generate these colors are as follows

1) create a SPD

2) normalize it (divide by the max)

3) create an XYZ color by taking the dot product of the samples of the SPD with the color matching function from [1]

xyz.X = 0.0f;
xyz.Y = 0.0f;
xyz.Z = 0.0f;

for (u_int i=0; i<n_cmf_samples; ++i)
{
    float I = spd.intensity(cmf_wl_samples[i]);

    xyz.X += cmf_x_samples[i]*I;
    xyz.Y += cmf_y_samples[i]*I;
    xyz.Z += cmf_z_samples[i]*I;
}

4) convert the XYZ color to RGB using the matrix form [2] or maybe [3]

5) tone map the RGB color (C = C/(1 + C))

6) clamp the RGB color

The result I get isn’t quite accurate, especially the black body spectrum. Any references or advice on how to improve my steps would be greatly appreciated!

Also if anyone understands how renderers use spds in their calculations let me know. I understand that luxrender uses sampling, but from their uncommented source code I can’t figure it out…

[1] http://www-cvrl.ucsd.edu/
[2] http://www.w3.org/Graphics/Color/sRGB
[3] http://www.brucelindbloom.com/index.html?Eqn_RGB_XYZ_Matrix.html

1 Reply

Please log in or register to post a reply.

F15213bd1bee350b83c3a2e5f9748b13
0
flux00 101 Sep 07, 2009 at 23:50

AIGHT NVM

a prof referred me to http://www.fourmilab.ch/documents/specrend/