Bxdfs are characterized as a collection of individually sampled lobes. Integrators may request samples from a subset of lobes (e.g. ask for only the diffuse part of the material response). The logic related to bxdf lobes is contained in
Diffuse lobes represent isotropic scattering of light, the appearance of which is largely independent of the viewing direction (V) (
k_Vn), but depends on surface normal (N) (
k_Nn) and incident light direction (the Bxdf direction parameter usually called Ln).
RenderMan supports up to 4 diffuse lobes.
Specular and Glossy Lobes
Specular lobes represent surfaces whose roughness ranges from wide glossy to mirror-like interaction, the appearance of which is dependent on the viewing direction (V), surface normal (N) and incident light direction (L). Note that perfectly specular lobes (mirror-like) should be marked as discrete (by setting the discrete flag in the lobe constructor, or using
RenderMan supports up to 8 specular lobes.
User lobes allow a bxdf to provide lighting-independent material properties to the integrator. For example, user lobes are used to provide a shading albedo, or provide alpha values for compositing.
RenderMan supports up to 12 user lobes. The last three lobes are reserved for subsurface scattering.
To facilitate subsurface scattering and marking rays as subsurface scattering rays, the last 3 of the 12 user lobes are reserved for subsurface scattering. A bxdf that generates a subsurface ray should set the ray's lobeSampled to diffuse transmission and the lobe ID to one of the three special values
k_RixBXSubsurfaceLobeId3 defined in RixBxdfLobe.h.
Bxdfs can emit light by overriding the
RixBxdf::EmitLocal() method. This local light emission is not considered by the lighting services and is therefore not importance sampled. Local light emission is intended for low intensity emission. If this emission significantly contributes to the lighting of the scene, a proper light source should be used for performance reasons (less noisy images).
Bxdf lobes are typically retrieved by name using the
RixBXLookupLobeByName routine. The names correspond to options set by the user or bridge. The first lobe of each type (diffuse, specular, user) is used as a catch all if node lookup fails. The following lists commonly declared lobe names: