RenderMan API  23.0
RixLighting.h
Go to the documentation of this file.
1 /*
2 # ------------------------------------------------------------------------------
3 #
4 # Copyright (c) 1986-2019 Pixar. All rights reserved.
5 #
6 # The information in this file (the "Software") is provided for the exclusive
7 # use of the software licensees of Pixar ("Licensees"). Licensees have the
8 # right to incorporate the Software into other products for use by other
9 # authorized software licensees of Pixar, without fee. Except as expressly
10 # permitted herein, the Software may not be disclosed to third parties, copied
11 # or duplicated in any form, in whole or in part, without the prior written
12 # permission of Pixar.
13 #
14 # The copyright notices in the Software and this entire statement, including the
15 # above license grant, this restriction and the following disclaimer, must be
16 # included in all copies of the Software, in whole or in part, and all permitted
17 # derivative works of the Software, unless such copies or derivative works are
18 # solely in the form of machine-executable object code generated by a source
19 # language processor.
20 #
21 # PIXAR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL
22 # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL PIXAR BE
23 # LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
24 # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
25 # OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
26 # CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. IN NO CASE WILL
27 # PIXAR'S TOTAL LIABILITY FOR ALL DAMAGES ARISING OUT OF OR IN CONNECTION WITH
28 # THE USE OR PERFORMANCE OF THIS SOFTWARE EXCEED $50.
29 #
30 # Pixar
31 # 1200 Park Ave
32 # Emeryville CA 94608
33 #
34 # ------------------------------------------------------------------------------
35 */
36 
37 #ifndef RixLighting_h
38 #define RixLighting_h
39 
40 #include "RixBxdf.h" // for RixBXEvaluateDomain, etc
41 #include "RixInterfaces.h" // for RixInterface
42 #include "ri.h" // for RtVector3, RtPoint3
43 
44 class RixPhotonGuiding;
45 class RixRNG;
46 class RixShadingContext;
47 struct RixBXLobeSampled;
48 struct RixBXLobeTraits;
49 struct RixBXLobeWeights;
50 
142 {
143 public:
145  {}
146 
147  // Local lighting (shading context aware and importance sampled)
149  {
153  };
154 
171  {
175  };
176  typedef FixedSampleCountMode Mode; // for backward compatibility
177 
182  {
183  public:
184  enum Mode
185  {
188  };
189 
190  Mode mode;
191 
192  SampleMode() : mode(k_forPoint){};
193  };
194 
225  virtual void Begin(
226  // inputs
227  RixShadingContext const* shadingContext, RixRNG* rixRNG,
228  RixBXEvaluateDomain evaluationDomain, IntegratorIntent integratorIntent,
229  FixedSampleCountMode fixedSampleCountMode, SampleMode sampleMode,
230  // outputs
231  int* fixedSampleCount = nullptr,
232  // inputs
233  int depth = 0, int parentIndirectCount = 1) = 0;
234 
323  virtual void GenerateSamples(
324  // Pointer parameters that represent arrays are expected to either be of size:
325  // - numPts (#1) or
326  // - numPts * numLightSamples (#2)
327  int numLightSamples, RixRNG* rixRNG,
328 
329  // outputs
330  int* lightGroupIds, // #2
331  RixLPEToken* lightLpeTokens, // #2
332  RtVector3* directionsToSamples, // #2
333  RtNormal3* lightNormals, // #2
334  float* distancesToSamples, // #2
335  RixBXLobeWeights* lightContributions,
336 
337  RtColorRGB* transmissions, // #2, optional
338  RtColorRGB* volumeEmissions, // #2, optional
339  float* directLightingPdfs, // #2
340  float* selectionProbs, // #2
341  // inputs
342  RixBXLobeTraits const* materialLobesWanted, // #1, optional
343 
344  // outputs
345  RixBXLobeWeights* evaluatedMaterialWeights, // optional
346  float* evaluatedMaterialFPdfs, // #2, optional
347  float* evaluatedMaterialRPdfs, // #2, optional
348  RixBXLobeTraits* evaluatedMaterialLobes, // #2, optional
349 
350  RixLight** sampledLights, // #2, optional
351 
352  // inputs
353  RtColorRGB const* pathThroughputs = nullptr // #1, optional
354  ) = 0;
355 
405  virtual void GenerateSamples(
406  // Pointer parameters that represent arrays are expected to either be of size:
407  // - numPts (#1) or
408  // - numPts * numLightSamples (#2)
409  // inputs
410  int numLightSamples, RixRNG* rixRNG,
411 
412  // outputs
413  int* lightGroupIds, // #2
414  RixLPEToken* lightLpeTokens, // #2
415  RtVector3* directionsToSamples, // #2
416  RtNormal3* lightNormals, // #2
417  float* distancesToSamples, // #2
418  RixBXLobeWeights* lightContributions,
419 
420  RtColorRGB* transmissions, // #2, optional
421  RtColorRGB* volumeEmissions, // #2, optional
422  float* directLightingPdfs, // #2
423  float* selectionProbs, // #2
424 
425  float* emissionPositionPdfs, // #2
426  float* emissionDirectionPdfs, // #2, FLT_MAX for infinite lights
427  float* solidAngleToAreaFactors, // #2, 1.0f for infinite lights
428 
429  // inputs
430  RixBXLobeTraits const* materialLobesWanted, // #1, optional
431 
432  // outputs
433  RixBXLobeWeights* evaluatedMaterialWeights, // optional
434  float* evaluatedMaterialFPdfs, // #2, optional
435  float* evaluatedMaterialRPdfs, // #2, optional
436  RixBXLobeTraits* evaluatedMaterialLobes, // #2, optional
437 
438  RixLight** sampledLights, // #2, optional
439 
440  // inputs
441  RtColorRGB const* pathThroughputs = nullptr, // #1, optional
442 
443  RixPhotonGuiding const* photonGuide = nullptr // optional
444  ) = 0;
445 
465  virtual void GenerateSamplesForRaySegments(
466  int numLightSamples,
467  // Pointer parameters that represent arrays are expected to be of size numPts
468  RixRNG* rixRNG, float* maxDistances, RtVector3* samplePositions, float* selectionProbs,
469  float* segmentMinT, float* segmentMaxT) = 0;
470 
544  virtual void EvaluateSamples(
545  // Pointer parameters that represent arrays are expected to either be of size:
546  // - numPts (#1) or
547  // - numPts * numMaterialSamples (#2)
548  // inputs
549  int numMaterialSamples, RixRNG* rixRNG,
550  RtVector3 const* directions, // #2
551 
552  // input/output
553  float* distances, // #2
554 
555  // inputs
556  float const* materialPdfs, // #2
557  RixBXLobeWeights const* materialWeights,
558  RixBXLobeSampled const* materialLobeSampled, // #2
559 
560  // outputs
561  int* lightGroupIds, // #2
562  RixLPEToken* lightLpeTokens, // #2
563  RixBXLobeWeights* lightContributions,
564  RtColorRGB* transmissions, // #2, optional
565  RtColorRGB* volumeEmissions, // #2, optional
566  float* directLightingPdfs, // #2
567  float* selectionProbs, // #2
568  RtNormal3* lightNormals, // #2
569 
570  RixLight** evaluatedLights, // #2, optional
571 
572  // inputs
573  RtColorRGB const* pathThroughputs = nullptr // #1, optional
574  ) = 0;
575 
576  // Bidirectional
621  virtual void EvaluateSamples(
622  // Pointer parameters that represent arrays are expected to either be of size:
623  // - numPts (#1) or
624  // - numPts * numMaterialSamples (#2)
625  // inputs
626  int numMaterialSamples, RixRNG* rixRNG,
627  RtVector3 const* directions, // #2
628 
629  // input/output
630  float* distances, // #2
631 
632  // inputs
633  float const* materialPdfs, // #2
634  RixBXLobeWeights const* materialWeights,
635  RixBXLobeSampled const* materialLobeSampled, // #2
636 
637  // outputs
638  int* lightGroupIds, // #2
639  RixLPEToken* lightLpeTokens, // #2
640  RixBXLobeWeights* lightContributions,
641  RtColorRGB* transmissions, // #2, optional
642  RtColorRGB* volumeEmissions, // #2, optional
643  float* directLightingPdfs, // #2
644  float* selectionProbs, // #2
645 
646  float* emissionPositionPdfs, // #2
647  float* emissionDirectionPdfs, // #2, FLT_MAX for infinite lights
648  float* solidAngleToAreaFactors, // #2, 1.0f for infinite lights
649 
650  RtNormal3* lightNormals,
651 
652  RixLight** evaluatedLights, // #2, optional
653 
654  // inputs
655  RtColorRGB const* pathThroughputs = nullptr, // #1, optional
656 
657  RixPhotonGuiding const* photonGuide = nullptr // optional
658  ) = 0;
659 
660  // Global lighting / emission for "photons"
672  virtual void BeginEmission(FixedSampleCountMode mode, int* fixedSampleCount = nullptr) = 0;
673 
797  virtual void GenerateEmission(
798  // Pointer parameters that represent arrays are expected to either be of size:
799  // - numPts (#1) or
800  // - numPts * numSamples (#2)
801  // inputs
802  int numPts,
803  int const* integratorContextIndices, // #1
804  int const* rayIds, // #2
805  int numSamples, RixRNG* rixRNG,
806 
807  // outputs
808  int* lightGroupIds, // #2
809  RixLPEToken* lightLpeTokens, // #2
810  RixBXLobeWeights* lightContributions, // #2
811 
812  RtColorRGB* transmissions, // #2
813  RtColorRGB* volumeEmissions, // #2
814 
815  int* numShadingContexts, // #1
816  RixShadingContext const*** shadingContexts, // See method description
817  RtPoint3* emissionPositions, // #2
818  RtVector3* emissionNormals, // #2
819 
820  float* distances, // #2
821  float* directLightingPdfs, // #2
822  float* selectionProbs, // #2
823  float* emissionPositionsPdfs, // #2
824  RtVector3* emissionDirections, // #2
825  float* emissionCosines, // #2
826  float* emissionDirectionPdfs, // #2
827  float* solidAngleToAreaFactors, // #2
828 
829  // inputs
830  RixPhotonGuiding const* photonGuide = nullptr // optional
831  ) = 0;
832 
836  virtual void End() = 0;
837 
841  virtual void EndEmission() = 0;
842 
843  // All the following methods are callable after RixIntegrator::Begin
844 
846  virtual int GetNumLightGroups() = 0;
848  virtual int GetLightGroup(RtUString const name) = 0;
850  virtual RtUString GetLightGroupName(int i) = 0;
851 
853  virtual int GetTotalNumLights() = 0;
855  virtual int GetTotalNumLightsWithFixedSamples() = 0;
857  virtual int GetTotalFixedSamples() = 0;
858 
862  virtual void UpdateWithResults(int nSamples, RixBXLobeWeights const* contribution,
863  RtColorRGB const* trans, RtFloat const* lPdfDirect,
864  RtFloat const* lightSelectionProbs, RtFloat const* distances,
865  RixBXLobeWeights const* evaluatedMaterialWeights,
866  const RixLight* const* lights) = 0;
867 
872  virtual void IrradianceEstimate(uint32_t lightSetId, RtPoint3 const* points, int numPts,
873  float* estimates, float* confidences) = 0;
874 
875  // (end)
876 
877 protected:
879  {}
882 };
883 
884 #endif
virtual void GenerateEmission(int numPts, int const *integratorContextIndices, int const *rayIds, int numSamples, RixRNG *rixRNG, int *lightGroupIds, RixLPEToken *lightLpeTokens, RixBXLobeWeights *lightContributions, RtColorRGB *transmissions, RtColorRGB *volumeEmissions, int *numShadingContexts, RixShadingContext const ***shadingContexts, RtPoint3 *emissionPositions, RtVector3 *emissionNormals, float *distances, float *directLightingPdfs, float *selectionProbs, float *emissionPositionsPdfs, RtVector3 *emissionDirections, float *emissionCosines, float *emissionDirectionPdfs, float *solidAngleToAreaFactors, RixPhotonGuiding const *photonGuide=nullptr)=0
Generates photons on the surface of the lights, then trace them through the scene. The resulting hits are returned in the form of RixShadingContext objects.
virtual ~RixLightingServices()
Definition: RixLighting.h:878
pxrcore::ColorRGB RtColorRGB
virtual void End()=0
Must be call in pair with Begin().
This struct represents the characteristics of just one lobe of a bxdf.
Definition: RixBxdfLobe.h:64
RixShadingContext const * shadingCtx
Definition: RixLighting.h:880
virtual void GenerateSamples(int numLightSamples, RixRNG *rixRNG, int *lightGroupIds, RixLPEToken *lightLpeTokens, RtVector3 *directionsToSamples, RtNormal3 *lightNormals, float *distancesToSamples, RixBXLobeWeights *lightContributions, RtColorRGB *transmissions, RtColorRGB *volumeEmissions, float *directLightingPdfs, float *selectionProbs, RixBXLobeTraits const *materialLobesWanted, RixBXLobeWeights *evaluatedMaterialWeights, float *evaluatedMaterialFPdfs, float *evaluatedMaterialRPdfs, RixBXLobeTraits *evaluatedMaterialLobes, RixLight **sampledLights, RtColorRGB const *pathThroughputs=nullptr)=0
Generates light samples for the shading points encapsulated by the RixShadingContext given to Begin()...
virtual int GetTotalFixedSamples()=0
float RtFloat
Definition: ri.h:54
RtFloat3 RtPoint3
Definition: RiTypesHelper.h:69
Deprecated, always use default-constructed object.
Definition: RixLighting.h:181
virtual void UpdateWithResults(int nSamples, RixBXLobeWeights const *contribution, RtColorRGB const *trans, RtFloat const *lPdfDirect, RtFloat const *lightSelectionProbs, RtFloat const *distances, RixBXLobeWeights const *evaluatedMaterialWeights, const RixLight *const *lights)=0
virtual void EvaluateSamples(int numMaterialSamples, RixRNG *rixRNG, RtVector3 const *directions, float *distances, float const *materialPdfs, RixBXLobeWeights const *materialWeights, RixBXLobeSampled const *materialLobeSampled, int *lightGroupIds, RixLPEToken *lightLpeTokens, RixBXLobeWeights *lightContributions, RtColorRGB *transmissions, RtColorRGB *volumeEmissions, float *directLightingPdfs, float *selectionProbs, RtNormal3 *lightNormals, RixLight **evaluatedLights, RtColorRGB const *pathThroughputs=nullptr)=0
Evaluate light contributions for the provided directions, w.r.t. shading points encapsulated by the R...
virtual int GetTotalNumLights()=0
RtFloat3 RtNormal3
Definition: RiTypesHelper.h:72
virtual RtUString GetLightGroupName(int i)=0
virtual int GetTotalNumLightsWithFixedSamples()=0
pxrcore::UString RtUString
virtual int GetLightGroup(RtUString const name)=0
virtual void GenerateSamplesForRaySegments(int numLightSamples, RixRNG *rixRNG, float *maxDistances, RtVector3 *samplePositions, float *selectionProbs, float *segmentMinT, float *segmentMaxT)=0
Generates light samples for the line segments encapsulated by the RixShadingContext given to Begin() ...
FixedSampleCountMode Mode
Definition: RixLighting.h:176
virtual void BeginEmission(FixedSampleCountMode mode, int *fixedSampleCount=nullptr)=0
Initializes the lighting services for photon emission. Photon emission is a global process...
Definition: RixRNG.h:59
RixBXEvaluateDomain
Definition: RixBxdf.h:121
RixBXEvaluateDomain domain
Definition: RixLighting.h:881
virtual void IrradianceEstimate(uint32_t lightSetId, RtPoint3 const *points, int numPts, float *estimates, float *confidences)=0
virtual void EndEmission()=0
Must be call in pair with BeginEmission().
virtual void Begin(RixShadingContext const *shadingContext, RixRNG *rixRNG, RixBXEvaluateDomain evaluationDomain, IntegratorIntent integratorIntent, FixedSampleCountMode fixedSampleCountMode, SampleMode sampleMode, int *fixedSampleCount=nullptr, int depth=0, int parentIndirectCount=1)=0
Initializes the lighting services for a given shading context. Following calls to GenerateSamples() a...
int RixLPEToken
virtual int GetNumLightGroups()=0
RtFloat3 RtVector3
Definition: RiTypesHelper.h:71