RenderManAPI  24.0
RixLighting.h
Go to the documentation of this file.
1 /*
2 # ------------------------------------------------------------------------------
3 #
4 # Copyright (c) 2020 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 "RiTypesHelper.h" // for RtVector3, RtPoint3
43 
44 class RixPhotonGuiding;
45 class RixRNG;
46 class RixShadingContext;
48 struct RixBXLobeSampled;
49 struct RixBXLobeTraits;
50 struct RixBXLobeWeights;
51 
143 {
144 public:
146  {}
147 
148  // Local lighting (shading context aware and importance sampled)
150  {
154  };
155 
172  {
176  };
177  typedef FixedSampleCountMode Mode; // for backward compatibility
178 
183  {
184  public:
185  enum Mode
186  {
189  };
190 
192 
194  };
195 
226  virtual void Begin(
227  // inputs
228  RixShadingContext const* shadingContext, RixRNG* rixRNG,
229  RixBXEvaluateDomain evaluationDomain, IntegratorIntent integratorIntent,
230  FixedSampleCountMode fixedSampleCountMode, SampleMode sampleMode,
231  // outputs
232  int* fixedSampleCount = nullptr,
233  // inputs
234  int depth = 0, int parentIndirectCount = 1) = 0;
235 
324  virtual void GenerateSamples(
325  // Pointer parameters that represent arrays are expected to either be of size:
326  // - numPts (#1) or
327  // - numPts * numLightSamples (#2)
328  int numLightSamples, RixRNG* rixRNG,
329 
330  // outputs
331  int* lightGroupIds, // #2
332  RixLPEToken* lightLpeTokens, // #2
333  RtVector3* directionsToSamples, // #2
334  RtNormal3* lightNormals, // #2
335  float* distancesToSamples, // #2
336  RixBXLobeWeights* lightContributions,
337 
338  RtColorRGB* transmissions, // #2, optional
339  RtColorRGB* volumeEmissions, // #2, optional
340  float* directLightingPdfs, // #2
341  float* selectionProbs, // #2
342  // inputs
343  RixBXLobeTraits const* materialLobesWanted, // #1, optional
344 
345  // outputs
346  RixBXLobeWeights* evaluatedMaterialWeights, // optional
347  float* evaluatedMaterialFPdfs, // #2, optional
348  float* evaluatedMaterialRPdfs, // #2, optional
349  RixBXLobeTraits* evaluatedMaterialLobes, // #2, optional
350 
351  RixLight** sampledLights, // #2, optional
352 
353  // inputs
354  RtColorRGB const* pathThroughputs = nullptr, // #1, optional
355  RixMWConnectionResult* mwConnectionResult = nullptr // optional
356  ) = 0;
357 
407  virtual void GenerateSamples(
408  // Pointer parameters that represent arrays are expected to either be of size:
409  // - numPts (#1) or
410  // - numPts * numLightSamples (#2)
411  // inputs
412  int numLightSamples, RixRNG* rixRNG,
413 
414  // outputs
415  int* lightGroupIds, // #2
416  RixLPEToken* lightLpeTokens, // #2
417  RtVector3* directionsToSamples, // #2
418  RtNormal3* lightNormals, // #2
419  float* distancesToSamples, // #2
420  RixBXLobeWeights* lightContributions,
421 
422  RtColorRGB* transmissions, // #2, optional
423  RtColorRGB* volumeEmissions, // #2, optional
424  float* directLightingPdfs, // #2
425  float* selectionProbs, // #2
426 
427  float* emissionPositionPdfs, // #2
428  float* emissionDirectionPdfs, // #2, FLT_MAX for infinite lights
429  float* solidAngleToAreaFactors, // #2, 1.0f for infinite lights
430 
431  // inputs
432  RixBXLobeTraits const* materialLobesWanted, // #1, optional
433 
434  // outputs
435  RixBXLobeWeights* evaluatedMaterialWeights, // optional
436  float* evaluatedMaterialFPdfs, // #2, optional
437  float* evaluatedMaterialRPdfs, // #2, optional
438  RixBXLobeTraits* evaluatedMaterialLobes, // #2, optional
439 
440  RixLight** sampledLights, // #2, optional
441 
442  // inputs
443  RtColorRGB const* pathThroughputs = nullptr, // #1, optional
444 
445  RixPhotonGuiding const* photonGuide = nullptr, // optional
446 
447  RixMWConnectionResult* mwConnectionResult = nullptr // optional
448  ) = 0;
449 
469  virtual void GenerateSamplesForRaySegments(
470  int numLightSamples,
471  // Pointer parameters that represent arrays are expected to be of size numPts
472  RixRNG* rixRNG, float* maxDistances, RtVector3* samplePositions, float* selectionProbs,
473  float* segmentMinT, float* segmentMaxT) = 0;
474 
548  virtual void EvaluateSamples(
549  // Pointer parameters that represent arrays are expected to either be of size:
550  // - numPts (#1) or
551  // - numPts * numMaterialSamples (#2)
552  // inputs
553  int numMaterialSamples, RixRNG* rixRNG,
554  RtVector3 const* directions, // #2
555 
556  // input/output
557  float* distances, // #2
558 
559  // inputs
560  float const* materialPdfs, // #2
561  RixBXLobeWeights const* materialWeights,
562  RixBXLobeSampled const* materialLobeSampled, // #2
563 
564  // outputs
565  int* lightGroupIds, // #2
566  RixLPEToken* lightLpeTokens, // #2
567  RixBXLobeWeights* lightContributions,
568  RtColorRGB* transmissions, // #2, optional
569  RtColorRGB* volumeEmissions, // #2, optional
570  float* directLightingPdfs, // #2
571  float* selectionProbs, // #2
572  RtNormal3* lightNormals, // #2
573 
574  RixLight** evaluatedLights, // #2, optional
575 
576  // inputs
577  RtColorRGB const* pathThroughputs = nullptr // #1, optional
578  ) = 0;
579 
580  // Bidirectional
625  virtual void EvaluateSamples(
626  // Pointer parameters that represent arrays are expected to either be of size:
627  // - numPts (#1) or
628  // - numPts * numMaterialSamples (#2)
629  // inputs
630  int numMaterialSamples, RixRNG* rixRNG,
631  RtVector3 const* directions, // #2
632 
633  // input/output
634  float* distances, // #2
635 
636  // inputs
637  float const* materialPdfs, // #2
638  RixBXLobeWeights const* materialWeights,
639  RixBXLobeSampled const* materialLobeSampled, // #2
640 
641  // outputs
642  int* lightGroupIds, // #2
643  RixLPEToken* lightLpeTokens, // #2
644  RixBXLobeWeights* lightContributions,
645  RtColorRGB* transmissions, // #2, optional
646  RtColorRGB* volumeEmissions, // #2, optional
647  float* directLightingPdfs, // #2
648  float* selectionProbs, // #2
649 
650  float* emissionPositionPdfs, // #2
651  float* emissionDirectionPdfs, // #2, FLT_MAX for infinite lights
652  float* solidAngleToAreaFactors, // #2, 1.0f for infinite lights
653 
654  RtNormal3* lightNormals,
655 
656  RixLight** evaluatedLights, // #2, optional
657 
658  // inputs
659  RtColorRGB const* pathThroughputs = nullptr, // #1, optional
660 
661  RixPhotonGuiding const* photonGuide = nullptr // optional
662  ) = 0;
663 
664  // Global lighting / emission for "photons"
676  virtual void BeginEmission(FixedSampleCountMode mode, int* fixedSampleCount = nullptr) = 0;
677 
801  virtual void GenerateEmission(
802  // Pointer parameters that represent arrays are expected to either be of size:
803  // - numPts (#1) or
804  // - numPts * numSamples (#2)
805  // inputs
806  int numPts,
807  int const* integratorContextIndices, // #1
808  int const* rayIds, // #2
809  int numSamples, RixRNG* rixRNG,
810 
811  // outputs
812  int* lightGroupIds, // #2
813  RixLPEToken* lightLpeTokens, // #2
814  RixBXLobeWeights* lightContributions, // #2
815 
816  RtColorRGB* transmissions, // #2
817  RtColorRGB* volumeEmissions, // #2
818 
819  int* numShadingContexts, // #1
820  RixShadingContext const*** shadingContexts, // See method description
821  RtPoint3* emissionPositions, // #2
822  RtVector3* emissionNormals, // #2
823 
824  float* distances, // #2
825  float* directLightingPdfs, // #2
826  float* selectionProbs, // #2
827  float* emissionPositionsPdfs, // #2
828  RtVector3* emissionDirections, // #2
829  float* emissionCosines, // #2
830  float* emissionDirectionPdfs, // #2
831  float* solidAngleToAreaFactors, // #2
832 
833  // inputs
834  RixPhotonGuiding const* photonGuide = nullptr // optional
835  ) = 0;
836 
840  virtual void End() = 0;
841 
845  virtual void EndEmission() = 0;
846 
847  // All the following methods are callable after RixIntegrator::Begin
848 
850  virtual int GetNumLightGroups() = 0;
852  virtual int GetLightGroup(RtUString const name) = 0;
854  virtual RtUString GetLightGroupName(int i) = 0;
855 
857  virtual int GetTotalNumLights() = 0;
859  virtual int GetTotalNumLightsWithFixedSamples() = 0;
861  virtual int GetTotalFixedSamples() = 0;
862 
866  virtual void UpdateWithResults(int nSamples, RixBXLobeWeights const* contribution,
867  RtColorRGB const* trans, float const* lPdfDirect,
868  float const* lightSelectionProbs, float const* distances,
869  RixBXLobeWeights const* evaluatedMaterialWeights,
870  const RixLight* const* lights) = 0;
871 
876  virtual void IrradianceEstimate(uint32_t lightSetId, RtPoint3 const* points, int numPts,
877  float* estimates, float* confidences) = 0;
878 
879  // (end)
880 
881 protected:
883  {}
886 };
887 
888 #endif
All-inlined interface for generating sample points for use by Monte Carlo integration and multiple-im...
Definition: RixRNG.h:59
RixShadingContext is analogous to a RenderMan grid - it is a group of 1 or more points that may be sh...
Definition: RixShading.h:663
Definition: RixPhotonGuiding.h:51
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, RixMWConnectionResult *mwConnectionResult=nullptr)=0
Generates light samples for the shading points encapsulated by the RixShadingContext given to Begin()...
virtual RtUString GetLightGroupName(int i)=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.
virtual int GetNumLightGroups()=0
RixLight This base class defines the interface for light sources.
Definition: RixLight.h:117
RixBXEvaluateDomain
The RixBxdf interface is a shading plugin responsible for creating a RixBxdf from the the ShadingCont...
Definition: RixBxdf.h:121
pxrcore::ColorRGB RtColorRGB
Definition: RiTypesHelper.h:520
Base class for all Rix interfaces.
Definition: RixInterfaces.h:133
virtual int GetLightGroup(RtUString const name)=0
RtFloat3 RtPoint3
Definition: RiTypesHelper.h:70
RixShadingContext const * shadingCtx
Definition: RixLighting.h:884
int RixLPEToken
Definition: RixInterfaces.h:977
virtual int GetTotalFixedSamples()=0
virtual void EndEmission()=0
Must be call in pair with BeginEmission().
This struct represents the characteristics of just one lobe of a bxdf.
Definition: RixBxdfLobe.h:63
Deprecated, always use default-constructed object.
Definition: RixLighting.h:182
Definition: RixBxdfLobe.h:428
FixedSampleCountMode
Definition: RixLighting.h:171
Definition: RixManifoldWalkConnection.h:42
RixLightingServices()
Definition: RixLighting.h:145
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.
virtual ~RixLightingServices()
Definition: RixLighting.h:882
Definition: RixLighting.h:151
IntegratorIntent
Definition: RixLighting.h:149
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.
RtFloat3 RtNormal3
Definition: RiTypesHelper.h:73
virtual int GetTotalNumLights()=0
Definition: RixBxdf.h:150
SampleMode()
Definition: RixLighting.h:193
RixBXEvaluateDomain domain
Definition: RixLighting.h:885
Usage
Definition: RixLighting.h:142
virtual int GetTotalNumLightsWithFixedSamples()=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() ...
virtual void UpdateWithResults(int nSamples, RixBXLobeWeights const *contribution, RtColorRGB const *trans, float const *lPdfDirect, float const *lightSelectionProbs, float const *distances, RixBXLobeWeights const *evaluatedMaterialWeights, const RixLight *const *lights)=0
Optional function to update the lighting services with results after the caller has independently com...
Mode
Definition: RixLighting.h:185
Definition: RixLighting.h:152
FixedSampleCountMode Mode
Definition: RixLighting.h:177
Mode mode
Definition: RixLighting.h:191
This struct represents the characteristics of potentially several lobes of a bxdf in aggregate...
Definition: RixBxdfLobe.h:178
virtual void End()=0
Must be call in pair with Begin().
pxrcore::UString RtUString
Definition: RiTypesHelper.h:682
virtual void BeginEmission(FixedSampleCountMode mode, int *fixedSampleCount=nullptr)=0
Initializes the lighting services for photon emission.
Definition: RixLighting.h:187
virtual void IrradianceEstimate(uint32_t lightSetId, RtPoint3 const *points, int numPts, float *estimates, float *confidences)=0
Return an estimates of the irridiance incident on a set of points in space This will be zero if no es...
RtFloat3 RtVector3
Definition: RiTypesHelper.h:72