28
28
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
29
29
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
30
30
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
33
33
#ifndef __KERNEL_MONTECARLO_CL__
34
34
#define __KERNEL_MONTECARLO_CL__
89
92
__device_inline void sample_uniform_hemisphere(const float3 N,
90
float randu, float randv,
91
float3 *omega_in, float *pdf)
93
float randu, float randv,
94
float3 *omega_in, float *pdf)
94
float r = sqrtf(max(0.f, 1.f - z*z));
95
float phi = 2.f * M_PI_F * randv;
97
float r = sqrtf(max(0.0f, 1.0f - z*z));
98
float phi = 2.0f * M_PI_F * randv;
96
99
float x = r * cosf(phi);
97
100
float y = r * sinf(phi);
102
105
*pdf = 0.5f * M_1_PI_F;
108
__device_inline void sample_uniform_cone(const float3 N, float angle,
109
float randu, float randv,
110
float3 *omega_in, float *pdf)
112
float z = cosf(angle*randu);
113
float r = sqrtf(max(0.0f, 1.0f - z*z));
114
float phi = 2.0f * M_PI_F * randv;
115
float x = r * cosf(phi);
116
float y = r * sinf(phi);
119
make_orthonormals (N, &T, &B);
120
*omega_in = x * T + y * B + z * N;
121
*pdf = 0.5f * M_1_PI_F / (1.0f - cosf(angle));
105
124
__device float3 sample_uniform_sphere(float u1, float u2)
107
126
float z = 1.0f - 2.0f*u1;
185
204
return make_float2(cr*p.x - sr*p.y, sr*p.x + cr*p.y);
188
/* Spherical coordinates <-> Cartesian direction */
190
__device float2 direction_to_spherical(float3 dir)
192
float theta = acosf(dir.z);
193
float phi = atan2f(dir.x, dir.y);
195
return make_float2(theta, phi);
198
__device float3 spherical_to_direction(float theta, float phi)
201
sinf(theta)*cosf(phi),
202
sinf(theta)*sinf(phi),
206
/* Equirectangular coordinates <-> Cartesian direction */
208
__device float2 direction_to_equirectangular(float3 dir)
210
float u = -atan2f(dir.y, dir.x)/(2.0f*M_PI_F) + 0.5f;
211
float v = atan2f(dir.z, hypotf(dir.x, dir.y))/M_PI_F + 0.5f;
213
return make_float2(u, v);
216
__device float3 equirectangular_to_direction(float u, float v)
218
float phi = M_PI_F*(1.0f - 2.0f*u);
219
float theta = M_PI_F*(1.0f - v);
227
/* Mirror Ball <-> Cartesion direction */
229
__device float3 mirrorball_to_direction(float u, float v)
231
/* point on sphere */
234
dir.x = 2.0f*u - 1.0f;
235
dir.z = 2.0f*v - 1.0f;
236
dir.y = -sqrt(max(1.0f - dir.x*dir.x - dir.z*dir.z, 0.0f));
239
float3 I = make_float3(0.0f, -1.0f, 0.0f);
241
return 2.0f*dot(dir, I)*dir - I;
244
__device float2 direction_to_mirrorball(float3 dir)
246
/* inverse of mirrorball_to_direction */
249
float div = 2.0f*sqrt(max(-0.5f*dir.y, 0.0f));
253
float u = 0.5f*(dir.x + 1.0f);
254
float v = 0.5f*(dir.z + 1.0f);
256
return make_float2(u, v);
259
207
CCL_NAMESPACE_END
261
209
#endif /* __KERNEL_MONTECARLO_CL__ */