summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--chroma/cuda/geometry_types.h3
-rw-r--r--chroma/cuda/hybrid_render.cu3
-rw-r--r--chroma/cuda/photon.h6
-rw-r--r--chroma/cuda/random.h20
-rw-r--r--chroma/geometry.py1
-rw-r--r--chroma/gpu/geometry.py18
6 files changed, 31 insertions, 20 deletions
diff --git a/chroma/cuda/geometry_types.h b/chroma/cuda/geometry_types.h
index ab54dfa..f82f372 100644
--- a/chroma/cuda/geometry_types.h
+++ b/chroma/cuda/geometry_types.h
@@ -30,13 +30,10 @@ struct Surface
float *reflect_specular;
float *eta;
float *k;
-
- float *reemission_wavelength;
float *reemission_cdf;
unsigned int model;
unsigned int n;
- unsigned int reemission_n;
unsigned int transmissive;
float step;
float wavelength0;
diff --git a/chroma/cuda/hybrid_render.cu b/chroma/cuda/hybrid_render.cu
index 29edefa..2c64d0e 100644
--- a/chroma/cuda/hybrid_render.cu
+++ b/chroma/cuda/hybrid_render.cu
@@ -44,6 +44,9 @@ to_diffuse(Photon &p, State &s, Geometry *g, curandState &rng, int max_steps)
if (p.history & REFLECT_DIFFUSE)
break;
+ if (p.history & SURFACE_REEMIT)
+ break;
+
if (command == BREAK)
break;
diff --git a/chroma/cuda/photon.h b/chroma/cuda/photon.h
index 68ea92c..09430e9 100644
--- a/chroma/cuda/photon.h
+++ b/chroma/cuda/photon.h
@@ -493,7 +493,7 @@ propagate_complex(Photon &p, State &s, curandState &rng, Surface* surface, bool
return BREAK;
}
else if (uniform_sample < absorb + reflect) {
- return propagate_at_specular_reflector(p, s);
+ return propagate_at_diffuse_reflector(p, s, rng);
}
else {
// transmit
@@ -515,7 +515,7 @@ propagate_at_wls(Photon &p, State &s, curandState &rng, Surface *surface, bool u
float uniform_sample = curand_uniform(&rng);
if (use_weights && p.weight > WEIGHT_LOWER_THRESHOLD && absorb < (1.0f - WEIGHT_LOWER_THRESHOLD)) {
- // Prevent absorption and reweight accordingly
+ // Prevent absorption and reweight accordingly
float survive = 1.0f - absorb;
absorb = 0.0f;
p.weight *= survive;
@@ -528,7 +528,7 @@ propagate_at_wls(Photon &p, State &s, curandState &rng, Surface *surface, bool u
float uniform_sample_reemit = curand_uniform(&rng);
if (uniform_sample_reemit < reemit) {
p.history |= SURFACE_REEMIT;
- p.wavelength = sample_cdf(&rng, surface->reemission_n, surface->reemission_wavelength, surface->reemission_cdf);
+ p.wavelength = sample_cdf(&rng, surface->n, surface->wavelength0, surface->step, surface->reemission_cdf);
return propagate_at_diffuse_reflector(p, s, rng); // reemit isotropically (eh?)
}
diff --git a/chroma/cuda/random.h b/chroma/cuda/random.h
index e9d2e75..ee528ea 100644
--- a/chroma/cuda/random.h
+++ b/chroma/cuda/random.h
@@ -44,6 +44,26 @@ sample_cdf(curandState *rng, int ncdf, float *cdf_x, float *cdf_y)
return cdf_x[lower] * frac + cdf_x[upper] * (1.0f - frac);
}
+// Sample from a uniformly-sampled CDF
+__device__ float
+sample_cdf(curandState *rng, int ncdf, float x0, float delta, float *cdf_y)
+{
+ float u = curand_uniform(rng);
+
+ int lower = 0;
+ int upper = ncdf - 1;
+ while(lower < upper-1) {
+ int half = (lower + upper) / 2;
+ if (u < cdf_y[half])
+ upper = half;
+ else
+ lower = half;
+ }
+
+ float frac = (u - cdf_y[lower]) / (cdf_y[upper] - cdf_y[lower]);
+ return (x0 + delta * lower) * frac + (x0 + delta * upper) * (1.0f - frac);
+}
+
extern "C"
{
diff --git a/chroma/geometry.py b/chroma/geometry.py
index 0b5c2a2..416a6e7 100644
--- a/chroma/geometry.py
+++ b/chroma/geometry.py
@@ -180,7 +180,6 @@ class Surface(object):
self.set('reflect_specular', 0)
self.set('eta', 0)
self.set('k', 0)
- self.set('reemission_wavelength', 0)
self.set('reemission_cdf', 0)
self.thickness = 0.0
diff --git a/chroma/gpu/geometry.py b/chroma/gpu/geometry.py
index 9622584..f74d32d 100644
--- a/chroma/gpu/geometry.py
+++ b/chroma/gpu/geometry.py
@@ -93,9 +93,6 @@ class GPUGeometry(object):
eta_gpu = ga.to_gpu(eta)
k = interp_material_property(wavelengths, surface.k)
k_gpu = ga.to_gpu(k)
-
- reemission_wavelength = interp_material_property(wavelengths, surface.reemission_wavelength)
- reemission_wavelength_gpu = ga.to_gpu(reemission_wavelength)
reemission_cdf = interp_material_property(wavelengths, surface.reemission_cdf)
reemission_cdf_gpu = ga.to_gpu(reemission_cdf)
@@ -105,22 +102,17 @@ class GPUGeometry(object):
self.surface_data.append(reflect_gpu)
self.surface_data.append(reflect_diffuse_gpu)
self.surface_data.append(reflect_specular_gpu)
- self.surface_data.append(eta)
- self.surface_data.append(k)
- self.surface_data.append(reemission_wavelength)
- self.surface_data.append(reemission_cdf)
+ self.surface_data.append(eta_gpu)
+ self.surface_data.append(k_gpu)
+ self.surface_data.append(reemission_cdf_gpu)
surface_gpu = \
make_gpu_struct(surface_struct_size,
[detect_gpu, absorb_gpu, reemit_gpu, reflect_gpu,
- reflect_diffuse_gpu,
- reflect_specular_gpu,
- eta_gpu, k_gpu,
- reemission_wavelength_gpu,
- reemission_cdf_gpu,
+ reflect_diffuse_gpu,reflect_specular_gpu,
+ eta_gpu, k_gpu, reemission_cdf_gpu,
np.uint32(surface.model),
np.uint32(len(wavelengths)),
- np.uint32(len(reemission_wavelength_gpu)),
np.uint32(surface.transmissive),
np.float32(wavelength_step),
np.float32(wavelengths[0]),