Light Path Expressions

Light Path Expressions

Quick Introduction

In RIS, in addition to the built-in AOVs , LPE, which is adopted from Open Shading Language's Light Path Expression, specifies what light transport paths to output to a display channel. In other words, we don't have to modify the shaders or plugins to output a custom AOV that uses the LPE.

The setup is the same as an AOV except we use a light path expression instead of an AOV channel name. We can also use a short descriptive name (e.g. lpe:diffuse) as well as the long LPE expression (e.g. lpe:CD<L.>).

Additionally, we can group the outputs by light groups and/or by geometry set up by a lpegroup.


LPE is made up of tokens which are not artist-friendly. For this reason, we provide a list of built-in LPEs with short descriptive names and hide the non-artist friendly expressions.

RenderMan for Maya

In RfM, LPE can be easily added by right click on a LPE name from the built-in LPEs list in RenderMan Controls' Add Channels/Outputs.


RenderMan for Katana

In RfK, LPE is specified via PrmanOutputChannelDefine. For a list of built-in LPE names, please see the Built-in LPEs table.



For DisplayChannel, we can use either the short name or long expression, e.g. lpe:diffuse or lpe:CD<L.>.

DisplayChannel "color lpe:diffuse"


DisplayChannel "color lpe:CD<L.>"

Built-in LPEs

Name Expression
lpe:diffuse lpe:CD<L.>
lpe:specular lpe:CS<L.>
lpe:emission lpe:CO
lpe:indirectdiffuse lpe:(C<RD>[DS]+<L.>)|(C<RD>[DS]*O)
lpe:indirectspecular lpe:(C<RS>[DS]+<L.>)|(C<RS>[DS]*O)
lpe:subsurface lpe:(C<TD>[DS]+<L.>)|(C<TD>[DS]*O)
lpe:refraction lpe:(C<T[S]>[DS]+<L.>)|(C<T[S]>[DS]*O)
lpe:shadowcollector lpe:shadows;C[<.D'collector'><.S'collector'>]<L.>
lpe:reflectioncollector lpe:C<RS'collector'>([DS]+<L.>)|([DS]*O)

lpe:shadowcollector collects shadow for objects that have a lpegroup <risLPEs.html#lpegroup> called "collector".

lpe:reflection collects reflection for objects that have a lpegroup <risLPEs.html#lpegroup> called "collector".

Note that these expressions are both disjoint and exhaustive; any individual light path will match exactly one of them. As a result, rendering out all nine of them and then compositing them together will produce the equivalent of the beauty image.

Caustics are not included in the built-in list because they overlap with lpe:indirectdiffuse. However, you can select caustics with the expression lpe:CD[S]+<L.>

LPE Outputs




Diffuse: lpe:diffuse


Specular: lpe:specular


Refraction: lpe:refraction


Caustics: lpe:CD[S]+<L.>


Indirect Specular: lpe:indirectspecular

Pig model by Tom Painter of Bigman 3D

Custom LPE

RenderMan for Maya

A custom LPE can be added in RenderMan Controls' Add Channels/Outputs:


RenderMan for Katana

Custom LPE is specified via PrmanOutputChannelDefine's Add Source:


LPE Macro

If the custom LPE is useful for other shots, you can add your custom LPE by creating a macro in rendermn.ini file. The custom LPE will appear in the RenderMan for Maya LPE list after relaunching Maya.

For example:

/prman/lpe/macro/myDiffuse    CD<L.>

Note that it is important to use <L.> instead of L so that it will be compatible with light groups. Otherwise, the renderer will output a warning.

  • Note

    The lpe: prefix will be automatically added to your macro's name when the file is parsed.

LPE Groups

LPE group lpegroup allows us to specify which object(s) we want to be use for the LPE channel.

RenderMan for Maya

In RfM, we add a lpegroup by selecting the objects and add the lpegroup RenderMan attribute.

RenderMan for Katana

In RfK, we add a lpegroup via PrmanObjectSettings' attributes/identifier/lpegroup.


Attribute "identifier" "string lpegroup" ["ground"]
DisplayChannel "varying color plane2Shadow" "string source" ["color lpe:shadows;C<.[DS]'ground'><L.>"]

Predefined lpegroup

For the built-in LPE such as shadowcollector or reflectioncollector, it assumes a predefined lpegroup named "collector". So for the objects that we want to collect shadow or reflection, we can simply name its lpegroup to "collector". Specifying lpe:shadowcollector will collect the shadow for these objects.

Advanced lpegroup logic

You can use the usual regular expression character classes syntax to define more complex LPEs by considering each lpegroup as a single character.

For instance, provided you are using lpegroups "foo" and "bar", you can define the following LPEs:


Light Groups

By default, LPEs retrieve the response to all lights in the scene. To limit the LPE to the contribution due to a single light or set of lights, assign each light to the group by setting the __group parameter on each light to the same name.

For the short LPE name, suffix the name with '_' followed by the light group name. For the long expression, place the light group name in single quotes inside the LPE.

For instance, say we have a light group named "key":

Using LPE name:

DisplayChannel "varying color lpe:diffuse_key"

Using LPE expression:

DisplayChannel "varying color lpe:CD<L.'key'>"

Per-Lobe LPEs

Bxdfs may have more than one diffuse or specular lobe which are summed for D and S, respectively. However, in some situations, it may be desirable to output a specific lobe separately.

For example, some PxrLM materials have a Clearcoat lobe. Normally this is summed under the S token. Routing this lobe to the S2 token will allow you to use S2 in your LPE's. Up to 4 diffuse lobes and 8 specular lobes are available for LPE's. By default, S1 contains all the specular lobes, so use any higher tokens such as S2 for your per-lobe LPE's.

Option "lpe" "string specular2" ["Clearcoat"]
DisplayChannel "color lpe:CS2<L.>"

This will cause a slight performance penalty but may be desirable to see lobes independently.

LPE Prefixes

  • unoccluded - returns unoccluded result.
  • noclamp - returns unclamp result.
  • nothruput - does not apply thruput (thruput is the accumulative albedo of the rayhit object).
  • shadows - returns collected shadows.
  • holdout - holdout LPE that directs the LPE output to the beauty channel.
  • overwrite - instead of outputting the accumulated result, overwrite it. One example of using this is for the albedo output where we do not want an accumulated result.
  • noinfinitecheck - do not do any infinite check.

LPE Tokens

  • C camera
  • D diffuse
  • S any specular * S1 specular1 * S2 specular2 * ...
  • D any diffuse * D1 diffuse1 * D2 diffuse2 * ...
  • R reflection
  • O emissive object
  • L geometric area light
  • T transmission (refraction/subsurface)
  • <> specifies <ScatteringType ScatteringEvent lpegroup>
    • Scattering types: L (light), T (transmission), R (relection), or O (emissive object)
    • Scattering events: D (diffuse), S (specular).
    • lpegroup: This is optional. If specified, the LPE only applies to that lpegroup.
  • () is for grouping.
  • [] is for regular expression. []* means 0 or more. []+ means 1 or more.

User Defined Signal

  • U token specifies a user defined signal. A Bxdf can output any user defined signal via the RixBXLobeWeights class. There are U1 to U8. By default, all user defined signals are set to U1.
  • If you have more than one user defined signal, it is important to direct each user defined signal to a different U token by setting them in rendermn.ini. Otherwise, all user defined signals that are assigned to the same U token will override each others!
  • U2 is set to the albedo output in the installed rendermn.ini.
  • To enable user lobes there is an option to add in the rendermn.ini file: /prman/lpe/enableuserlobes 0|1 The default is 0 (off). Or the user may add the rendering option: Option "lpe" "int enableuserlobes" 0|1 The default is 0 (off). This option is experimental.
/prman/lpe/user2                Albedo


  • <L.> means Light scattering type with all scattering events. For light group AOVs, using <L.> is required instead of L.
  • lpe:CD<L.> means camera with diffuse scattering event for light scattering type.
  • lpe:CO means camera with emissive objection (since emissive does not need any light, there is no L).