Changeset View
Changeset View
Standalone View
Standalone View
intern/cycles/kernel/kernel_montecarlo.h
| Show First 20 Lines • Show All 79 Lines • ▼ Show 20 Lines | ccl_device_inline void sample_uniform_hemisphere( | ||||
| *omega_in = x * T + y * B + z * N; | *omega_in = x * T + y * B + z * N; | ||||
| *pdf = 0.5f * M_1_PI_F; | *pdf = 0.5f * M_1_PI_F; | ||||
| } | } | ||||
| /* sample direction uniformly distributed in cone */ | /* sample direction uniformly distributed in cone */ | ||||
| ccl_device_inline void sample_uniform_cone( | ccl_device_inline void sample_uniform_cone( | ||||
| const float3 N, float angle, float randu, float randv, float3 *omega_in, float *pdf) | const float3 N, float angle, float randu, float randv, float3 *omega_in, float *pdf) | ||||
| { | { | ||||
| float z = cosf(angle * randu); | float zMin = cosf(angle); | ||||
| float r = sqrtf(max(0.0f, 1.0f - z * z)); | float z = lerp(zMin, 1.0f, randu); | ||||
| float r = safe_sqrtf(1.0f - sqr(z)); | |||||
| float phi = M_2PI_F * randv; | float phi = M_2PI_F * randv; | ||||
| float x = r * cosf(phi); | float x = r * cosf(phi); | ||||
| float y = r * sinf(phi); | float y = r * sinf(phi); | ||||
| float3 T, B; | float3 T, B; | ||||
| make_orthonormals(N, &T, &B); | make_orthonormals(N, &T, &B); | ||||
| *omega_in = x * T + y * B + z * N; | *omega_in = x * T + y * B + z * N; | ||||
| *pdf = 0.5f * M_1_PI_F / (1.0f - cosf(angle)); | *pdf = M_1_2PI_F / (1.0f - zMin); | ||||
| } | } | ||||
| /* sample uniform point on the surface of a sphere */ | /* sample uniform point on the surface of a sphere */ | ||||
| ccl_device float3 sample_uniform_sphere(float u1, float u2) | ccl_device float3 sample_uniform_sphere(float u1, float u2) | ||||
| { | { | ||||
| float z = 1.0f - 2.0f * u1; | float z = 1.0f - 2.0f * u1; | ||||
| float r = sqrtf(fmaxf(0.0f, 1.0f - z * z)); | float r = sqrtf(fmaxf(0.0f, 1.0f - z * z)); | ||||
| float phi = M_2PI_F * u2; | float phi = M_2PI_F * u2; | ||||
| ▲ Show 20 Lines • Show All 188 Lines • Show Last 20 Lines | |||||