Page tree

Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

Bxdfs can help integrators converge more quickly by providing hints about the domain over which they need to be integrated (the full domain being the entire sphere). This is done by the bxdf implementing implementing a RixBxdf::GetEvaluateDomain() to return the proper  function that returns the appropriate RixBXEvaluateDomain value. This value informs the integrator about the domain on which RixBxdf::EvaluateSample() and RixBxdf::EvaluateSamplesAtIndex() would return non-zero values (i.e. a non-zero material response).

...

  • the bxdf doesn't scatter light at all, but may still emit some (through RixBxdf::EmitLocal())
  • the bxdf only generate generates discrete samples (which by definition can never be evaluated) on the entire domain

...

This indicates that the bxdf represents a surface that only reflects light from the inside. That is: VL lie  V and  L lie in the inside hemisphereinside hemisphere.

k_RixBXInsideTransmit = 8

...

Note that if used for a closed object, this would allow light to exit the object, but not go through it. This would only make sense if a light is placed inside the object.

k_RixBXVolume = 16

This indicate indicates that the bxdf represent represents a volumetric scattering event. This is different from using all of the above, since in the volumetric case, there is no surface cosine term to consider during integration.

...

k_RixBXOutside = (k_RixBXOutsideReflect | k_RixBXOutsideTransmit)

This describe describse surfaces that will only consider light coming from the outside.

k_RixBXInside = (k_RixBXInsideReflect | k_RixBXInsideTransmit)

This describe describes surfaces that will only consider light coming from the inside.

Additional Considerations

Reciprocity

Using only k_RixBXOutsideReflect and k_RixBXInsideReflect doesn't prevent the bxdf from being reciprocal.

...

First, note that using k_RixBXBoth (or k_RixBXVolume) is the best way to ensure your bxdf works properly, as a reference. When choosing a different evaluation domain (for evaluation efficiency), you need to make sure the render rendered image doesn't change , or this – if it does change, that could mean you are artificially restricting the evaluation domain of your bxdf, and potentially introduce render introducing rendering artifacts.

Most of the time, when dealing with closed and non-transmissive (i.e. translucent) objects, you should be able to restrict the evaluation domain (using k_RixBXOutsideReflect). This would allow the integrator to skip processing light samples that lie behind the surface (on the other side of the closed object itself for example), reducing the number of bxdf evaluations required, as well as the number of transmission rays that need to be cast.

When dealing with transmissive (i.e. translucent) objects, but and only expect translucent feature scattering to come from lights placed inside the objects, you may be able to use k_RixBXInsideTransmit, without k_RixBXOutsideTransmit.

...