Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'intern/cycles/kernel/svm/svm_sky.h')
-rw-r--r--intern/cycles/kernel/svm/svm_sky.h27
1 files changed, 15 insertions, 12 deletions
diff --git a/intern/cycles/kernel/svm/svm_sky.h b/intern/cycles/kernel/svm/svm_sky.h
index 8b4e35816d0..d81f6ece46c 100644
--- a/intern/cycles/kernel/svm/svm_sky.h
+++ b/intern/cycles/kernel/svm/svm_sky.h
@@ -19,8 +19,8 @@
CCL_NAMESPACE_BEGIN
/*
- * "A Practical Analytic Model for Daylight"
- * A. J. Preetham, Peter Shirley, Brian Smits
+ * "An Analytic Model for Full Spectral Sky-Dome Radiance"
+ * Lukas Hosek, Alexander Wilkie
*/
__device float sky_angle_between(float thetav, float phiv, float theta, float phi)
@@ -29,12 +29,16 @@ __device float sky_angle_between(float thetav, float phiv, float theta, float ph
return safe_acosf(cospsi);
}
-__device float sky_perez_function(__constant float *lam, float theta, float gamma)
+/* ArHosekSkyModel_GetRadianceInternal */
+__device float sky_radiance_internal(__constant float *configuration, float theta, float gamma)
{
- float ctheta = cosf(theta);
- float cgamma = cosf(gamma);
+ const float expM = expf(configuration[4] * gamma);
+ const float rayM = cosf(gamma)*cosf(gamma);
+ const float mieM = (1.0f + cosf(gamma)*cosf(gamma)) / powf((1.0f + configuration[8]*configuration[8] - 2.0f*configuration[8]*cosf(gamma)), 1.5f);
+ const float zenith = sqrt(cosf(theta));
- return (1.0f + lam[0]*expf(lam[1]/ctheta)) * (1.0f + lam[2]*expf(lam[3]*gamma) + lam[4]*cgamma*cgamma);
+ return (1.0f + configuration[0] * expf(configuration[1] / (cosf(theta) + 0.01f))) *
+ (configuration[2] + configuration[3] * expM + configuration[5] * rayM + configuration[6] * mieM + configuration[7] * zenith);
}
__device float3 sky_radiance(KernelGlobals *kg, float3 dir)
@@ -50,14 +54,13 @@ __device float3 sky_radiance(KernelGlobals *kg, float3 dir)
/* clamp theta to horizon */
theta = min(theta, M_PI_2_F - 0.001f);
- /* compute xyY color space values */
- float x = kernel_data.sunsky.zenith_x * sky_perez_function(kernel_data.sunsky.perez_x, theta, gamma);
- float y = kernel_data.sunsky.zenith_y * sky_perez_function(kernel_data.sunsky.perez_y, theta, gamma);
- float Y = kernel_data.sunsky.zenith_Y * sky_perez_function(kernel_data.sunsky.perez_Y, theta, gamma);
+ /* compute xyz color space values */
+ float x = sky_radiance_internal(kernel_data.sunsky.config_x, theta, gamma) * kernel_data.sunsky.radiance_x;
+ float y = sky_radiance_internal(kernel_data.sunsky.config_y, theta, gamma) * kernel_data.sunsky.radiance_y;
+ float z = sky_radiance_internal(kernel_data.sunsky.config_z, theta, gamma) * kernel_data.sunsky.radiance_z;
/* convert to RGB */
- float3 xyz = xyY_to_xyz(x, y, Y);
- return xyz_to_rgb(xyz.x, xyz.y, xyz.z);
+ return xyz_to_rgb(x, y, z);
}
__device void svm_node_tex_sky(KernelGlobals *kg, ShaderData *sd, float *stack, uint dir_offset, uint out_offset)