Igloo Matrix BSDF



Example of igloo matrix BSDF

bsdf This BSDF model uses tabulated values, using an igloo shaped patch subdivision of the hemisphere. Incident and scattered vectors use the same basis.

This coordinate system is a generalization of the Klems angle basis used in Randiance and Window/Optics software described in BSDFs, Matrices and Phases by Andy McNeil, LBNL.


Using this feature requires an Advanced Edition license


Room daylighting simulation with a sun redirector film

Patch geometry : The hemisphere is first split along theta (angle to the surface normal) with any user-defined subdivision. For instance, the Klems basis uses 0°, 5°, 15°, 25°, 35°, 45°, 55°, 65°, 75° and 90°. These boundary values delimit band rings on the hemisphere.

Each band is then split evenly along the phi axis, with a user-defined number of subdivisions for each ring. For instance, the Klems basis uses:

0° to 5° 1 patch
5° to 15° 8 patches
15° to 25° 16 patches
25° to 35° 20 patches
35° to 45° 24 patches
45° to 55° 24 patches
55° to 65° 24 patches
65° to 75° 16 patches
75° to 90° 12 patches

Patch numbering : For the incident vector, each patch is then numbered starting from 0, in theta and phi order. For the scattered vector, numbers are rotated by 180° around the normal direction. This allows having the same patch number for scattered and incident vectors in the case of specular reflection.

BTDF : The transmission data uses the same basis obtained by symmetry with respect to the surface plane.

The following figure shows the subdivisions and numbering for the Klems angle basis:


The igloo patch numbering convention for incident vector (left) and scattered vector (right)

BSDF values : The BSDF values for any incident and scattered patch pair is given as a matrix, column indices matching incident patches, row indices mapping scattered patches. This matrix has the following properties:

  • A fully specular BRDF or BTDF will correspond to a diagonal matrix, thanks to the scattered patch numbering rotation explained above.
  • BSDF reciprocity (value is kept inchanged by flipping incident and scattered directions) means that non diagonal coefficients will be equal by pairs. However, due to the scattered patch numbering rotation explained above, this is not a simple matrix transposition, as if the patch numbering was the same for incident and scattered directions.

A complete BSDF consists in three matrices : one for transmission (BTDF) and one for reflection on each side (front and back BRDFs). However, it is not necessary to provide each:

  • Missing BTDF matrix results in a non transparent material
  • If a single BRDF matrix is supplied, the reflection is symmetric
  • If no BRDF matrix is supplied, the material has zero reflection

Example of BRDF data representation for the incident direction 87

Channels : The BSDF coefficients may be RGB, spectral values, or any set of channels having a primary spectrum. These primaries are represented by the spectrum children nodes. For instance:

  • An achromatic (gray) BSDF will have a single spectrum child primary. The spectrum will be uniform, with a value of 1
  • A RGB BSDF will have three primaries, each being set to R, G and B primary spectrum using preset spectra.
  • A spectral BSDF will, for instance use a set of square spectra as primaries.

Children Nodes

This node is a spectrum list. It may have a variable number of spectrum children.

Spectrum user-defined First primary
Spectrum user-defined Second primary
Spectrum user-defined ...

Ocean XML 4.0 example

Matrixes encoding

Each matrix is encoded as a list of coefficients. The number of coefficients is : nchannels * npatches * npatches.

For the ith channel, the jth scattered patch, and kth incident patch, the coefficient index is :

i + j * nchannels + k * nchannels * npatches

Or said differently, the coefficients are sorted by incident patch, then by scattered patch, then by channel.

<bsdf type="igloomatrix" name="bsdf">
     <spectrum type="uniform" name="" id="0" value="1"/>
     <flist name="theta">
             0 5 15 25 35 45 55 65 75 90
     <ilist name="numphi">
             1 8 16 20 24 24 24 16 12
     <flist name="btdf">
             36.5314 0 0 0 0 <!-- Actual data skipped - 145*145 values -->
     <flist name="brdf_front">
             3.69662 0 0 0 0 <!-- Actual data skipped - 145*145 values -->
     <flist name="brdf_back">
             4.26844 0 0 0 0 <!-- Actual data skipped - 145*145 values -->

Note : If reflectivity is the same on both sides, a single BRDF may be provided with:

<flist name="brdf">
     4.26844 0 0 0 0 <!-- Actual data skipped - 145*145 values -->