Color Handling In OSL Shaders


OctaneRender® is a spectral renderer, so it handles the color variable type in a somewhat non-standard way.


Spectrum And RGB

Depending on what returned a given color value, a color variable is represented internally as RGB or as a spectral color. When expressions use both RGB colors and spectral colors, the RGB colors are converted to spectral colors.

A is an RGB color:

color a = 1;

B is an RGB color:

color b = {1, 0.5, 0};

C is a spectral color:

color c = _gaussian(1, 0.5, 0.01);

Adding two RGB colors results in another RGB color:

color d = a + b

Note: Adding a spectral color to another color always results in a spectral color.

In practice, most colors end up representing as RGB colors. The main exceptions are blackbody and Gaussian spectra.

RGB colors support element access (using []) and casting to point-like types. For spectral colors, this can be done as an approximation, and the result will have poor color fidelity. The compiler will emit a warning if this happens.

To learn more about programming with the Open Shader LanguageA shading language developed by Sony Pictures Imageworks. There are multiple render engines that utilize OSL as it is particularly suited for physically-based renderers., see The Octane OSL Guide.