diff options
-rw-r--r-- | chroma/cuda/geometry_types.h | 3 | ||||
-rw-r--r-- | chroma/cuda/hybrid_render.cu | 3 | ||||
-rw-r--r-- | chroma/cuda/photon.h | 6 | ||||
-rw-r--r-- | chroma/cuda/random.h | 20 | ||||
-rw-r--r-- | chroma/geometry.py | 1 | ||||
-rw-r--r-- | chroma/gpu/geometry.py | 18 |
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]), |