diff options
Diffstat (limited to 'src/kernel.cu')
-rw-r--r-- | src/kernel.cu | 49 |
1 files changed, 28 insertions, 21 deletions
diff --git a/src/kernel.cu b/src/kernel.cu index 2cd9347..711ae80 100644 --- a/src/kernel.cu +++ b/src/kernel.cu @@ -18,7 +18,7 @@ __device__ void fAtomicAdd(float *addr, float data) data = atomicExch(addr, data+atomicExch(addr, 0.0f)); } -__device__ void to_diffuse(Photon &p, State &s, const int &max_steps) +__device__ void to_diffuse(Photon &p, State &s, curandState &rng, const int &max_steps) { int steps = 0; while (steps < max_steps) @@ -27,12 +27,12 @@ __device__ void to_diffuse(Photon &p, State &s, const int &max_steps) int command; - command = fill_state(s, p); + command = fill_state(s, p, rng); if (command == BREAK) break; - command = propagate_to_boundary(p, s); + command = propagate_to_boundary(p, s, rng); if (command == BREAK) break; @@ -42,7 +42,7 @@ __device__ void to_diffuse(Photon &p, State &s, const int &max_steps) if (s.surface_index != -1) { - command = propagate_at_surface(p, s); + command = propagate_at_surface(p, s, rng); if (p.history & REFLECT_DIFFUSE) break; @@ -54,7 +54,7 @@ __device__ void to_diffuse(Photon &p, State &s, const int &max_steps) continue; } - propagate_at_boundary(p, s); + propagate_at_boundary(p, s, rng); } // while (steps < max_steps) @@ -93,12 +93,13 @@ __global__ void build_rgb_lookup(int nthreads, curandState *rng_states, float3 * if (id >= nthreads) return; + curandState rng = rng_states[id]; + Photon seed; - seed.rng = rng_states[id]; seed.position = positions[id]; seed.direction = directions[id]; seed.direction /= norm(seed.direction); - seed.polarization = uniform_sphere(&seed.rng); + seed.polarization = uniform_sphere(&rng); seed.time = 0.0f; seed.history = 0x0; @@ -130,7 +131,7 @@ __global__ void build_rgb_lookup(int nthreads, curandState *rng_states, float3 * p = seed; p.wavelength = RED_WAVELENGTH; - to_diffuse(p, s, max_steps); + to_diffuse(p, s, rng, max_steps); if (p.history & REFLECT_DIFFUSE) { @@ -147,7 +148,7 @@ __global__ void build_rgb_lookup(int nthreads, curandState *rng_states, float3 * p = seed; p.wavelength = BLUE_WAVELENGTH; - to_diffuse(p, s, max_steps); + to_diffuse(p, s, rng, max_steps); if (p.history & REFLECT_DIFFUSE) { @@ -164,7 +165,7 @@ __global__ void build_rgb_lookup(int nthreads, curandState *rng_states, float3 * p = seed; p.wavelength = GREEN_WAVELENGTH; - to_diffuse(p, s, max_steps); + to_diffuse(p, s, rng, max_steps); if (p.history & REFLECT_DIFFUSE) { @@ -179,6 +180,8 @@ __global__ void build_rgb_lookup(int nthreads, curandState *rng_states, float3 * } } + rng_states[id] = rng; + } // build_rgb_lookup __global__ void render(int nthreads, curandState *rng_states, float3 *positions, float3 *directions, float3 *rgb_lookup1, float3 *rgb_lookup2, int runs, int *pixels, int max_steps) @@ -188,12 +191,13 @@ __global__ void render(int nthreads, curandState *rng_states, float3 *positions, if (id >= nthreads) return; + curandState rng = rng_states[id]; + Photon seed; - seed.rng = rng_states[id]; seed.position = positions[id]; seed.direction = directions[id]; seed.direction /= norm(seed.direction); - seed.polarization = uniform_sphere(&seed.rng); + seed.polarization = uniform_sphere(&rng); seed.time = 0.0f; seed.history = 0x0; @@ -207,7 +211,7 @@ __global__ void render(int nthreads, curandState *rng_states, float3 *positions, p = seed; p.wavelength = RED_WAVELENGTH; - to_diffuse(p, s, max_steps); + to_diffuse(p, s, rng, max_steps); if (p.history & REFLECT_DIFFUSE) { @@ -224,7 +228,7 @@ __global__ void render(int nthreads, curandState *rng_states, float3 *positions, p = seed; p.wavelength = BLUE_WAVELENGTH; - to_diffuse(p, s, max_steps); + to_diffuse(p, s, rng, max_steps); if (p.history & REFLECT_DIFFUSE) { @@ -241,7 +245,7 @@ __global__ void render(int nthreads, curandState *rng_states, float3 *positions, p = seed; p.wavelength = GREEN_WAVELENGTH; - to_diffuse(p, s, max_steps); + to_diffuse(p, s, rng, max_steps); if (p.history & REFLECT_DIFFUSE) { @@ -264,6 +268,8 @@ __global__ void render(int nthreads, curandState *rng_states, float3 *positions, pixels[id] = r << 16 | g << 8 | b; + rng_states[id] = rng; + } // render /* Trace the rays starting at `positions` traveling in the direction @@ -311,8 +317,9 @@ __global__ void propagate(int nthreads, curandState *rng_states, float3 *positio if (id >= nthreads) return; + curandState rng = rng_states[id]; + Photon p; - p.rng = rng_states[id]; p.position = positions[id]; p.direction = directions[id]; p.direction /= norm(p.direction); @@ -335,12 +342,12 @@ __global__ void propagate(int nthreads, curandState *rng_states, float3 *positio int command; - command = fill_state(s, p); + command = fill_state(s, p, rng); if (command == BREAK) break; - command = propagate_to_boundary(p, s); + command = propagate_to_boundary(p, s, rng); if (command == BREAK) break; @@ -350,7 +357,7 @@ __global__ void propagate(int nthreads, curandState *rng_states, float3 *positio if (s.surface_index != -1) { - command = propagate_at_surface(p, s); + command = propagate_at_surface(p, s, rng); if (command == BREAK) break; @@ -359,11 +366,11 @@ __global__ void propagate(int nthreads, curandState *rng_states, float3 *positio continue; } - propagate_at_boundary(p, s); + propagate_at_boundary(p, s, rng); } // while (steps < max_steps) - rng_states[id] = p.rng; + rng_states[id] = rng; positions[id] = p.position; directions[id] = p.direction; polarizations[id] = p.polarization; |