Fermat
pssmlt.h
1 /*
2  * Fermat
3  *
4  * Copyright (c) 2016-2019, NVIDIA CORPORATION. All rights reserved.
5  *
6  * Redistribution and use in source and binary forms, with or without
7  * modification, are permitted provided that the following conditions are met:
8  * * Redistributions of source code must retain the above copyright
9  * notice, this list of conditions and the following disclaimer.
10  * * Redistributions in binary form must reproduce the above copyright
11  * notice, this list of conditions and the following disclaimer in the
12  * documentation and/or other materials provided with the distribution.
13  * * Neither the name of the NVIDIA CORPORATION nor the
14  * names of its contributors may be used to endorse or promote products
15  * derived from this software without specific prior written permission.
16  *
17  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
18  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
19  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
20  * DISCLAIMED. IN NO EVENT SHALL NVIDIA CORPORATION BE LIABLE FOR ANY
21  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
22  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
23  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
24  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
26  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27  */
28 
29 #pragma once
30 
31 #include <types.h>
32 #include <buffers.h>
33 #include <ray.h>
34 #include <lights.h>
35 #include <vertex_storage.h>
36 #include <bpt_options.h>
37 #include <bpt_queues.h>
38 #include <tiled_sequence.h>
39 #include <cugar/sampling/lfsr.h>
40 #include <renderer_interface.h>
41 
42 struct RenderingContext;
44 struct PSSMLTContext;
45 
48 
51 
55 {
56  uint32 n_chains;
57  uint32 spp;
58  bool rr;
59  bool light_perturbations;
60  bool eye_perturbations;
61  float independent_samples;
62 
63  PSSMLTOptions() :
65  n_chains(64 * 1024),
66  spp(4),
67  rr(true),
68  light_perturbations(true),
69  eye_perturbations(true),
70  independent_samples(0.0f)
71  {
72  BPTOptionsBase::light_tracing = 0.0f;
73  }
74 
75  void parse(const int argc, char** argv)
76  {
77  BPTOptionsBase::parse(argc, argv);
78 
79  for (int i = 0; i < argc; ++i)
80  {
81  if (strcmp(argv[i], "-chains") == 0)
82  n_chains = atoi(argv[++i]) * 1024;
83  else if (strcmp(argv[i], "-spp") == 0)
84  spp = atoi(argv[++i]);
85  else if (strcmp(argv[i], "-rr") == 0)
86  rr = atoi(argv[++i]) > 0;
87  else if (strcmp(argv[i], "-light-perturbations") == 0)
88  light_perturbations = atoi(argv[++i]) > 0;
89  else if (strcmp(argv[i], "-eye-perturbations") == 0)
90  eye_perturbations = atoi(argv[++i]) > 0;
91  else if (strcmp(argv[i], "-perturbations") == 0)
92  light_perturbations = eye_perturbations = atoi(argv[++i]) > 0;
93  else if (strcmp(argv[i], "-independent-samples") == 0 ||
94  strcmp(argv[i], "-independent") == 0 ||
95  strcmp(argv[i], "-is") == 0)
96  independent_samples = (float)atof(argv[++i]);
97  }
98  }
99 };
100 
104 {
105  PSSMLT();
106 
107  void init(int argc, char** argv, RenderingContext& renderer);
108 
109  void render(const uint32 instance, RenderingContext& renderer);
110 
111  void sample_seeds(const uint32 n_chains);
112 
113  void recover_primary_coordinates(PSSMLTContext& context, RenderingContextView& renderer_view);
114 
115  void destroy() { delete this; }
116 
117  static RendererInterface* factory() { return new PSSMLT(); }
118 
119  PSSMLTOptions m_options;
120 
121  TiledSequence m_sequence;
122 
123  BPTQueuesStorage m_queues;
124 
125  VertexStorage m_light_vertices;
126 
132  DomainBuffer<CUDA_BUFFER, float4> m_connections_value;
133  DomainBuffer<CUDA_BUFFER, float> m_connections_cdf;
137  float m_image_brightness;
138  uint32 m_n_lights;
139  uint32 m_n_init_light_paths;
140  uint32 m_n_init_paths;
141  uint32 m_n_connections;
142  float m_time;
143 
144  cugar::LFSRGeneratorMatrix m_generator;
145  cugar::LFSRRandomStream m_random;
146 };
147 
Definition: pssmlt.h:54
Definition: lfsr.h:66
Definition: tiled_sequence.h:131
Definition: vertex_storage.h:73
Definition: renderer_interface.h:45
Definition: lfsr.h:109
Definition: pssmlt.h:103
Definition: renderer.h:52
void destroy()
Definition: pssmlt.h:115
Definition: bpt_queues.h:51
Definition: renderer_view.h:80
Defines several random samplers.
Definition: bpt_options.h:42