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:
authorLukas Stockner <lukas.stockner@freenet.de>2020-07-08 03:10:02 +0300
committerLukas Stockner <lukas.stockner@freenet.de>2020-07-08 03:15:37 +0300
commit7fcb6bc59c85beab36dbfcec91d0cfaf5291f029 (patch)
tree0e7c93521d34efd2ba43ea8847dc2661effa34c3 /intern/cycles/kernel/shaders/node_sky_texture.osl
parentafcb41a0aaafce5b99891487a402d78a337f3809 (diff)
Fix T78324: Different Sky Texture results between CPU and GPU
The problem here was numerical precision: The code calculates the angle between sun and view direction, and the usual acos(dot(a, b)) approach for that has poor numerical performance for almost parallel angles. As a result, the generally tiny difference between floating point computation between CPU and GPU was enough to make the sun vanish at different radii, causing different results. The new version fixes the difference by making the computation much more robust on both platforms.
Diffstat (limited to 'intern/cycles/kernel/shaders/node_sky_texture.osl')
-rw-r--r--intern/cycles/kernel/shaders/node_sky_texture.osl7
1 files changed, 6 insertions, 1 deletions
diff --git a/intern/cycles/kernel/shaders/node_sky_texture.osl b/intern/cycles/kernel/shaders/node_sky_texture.osl
index 08bc8f85120..20d379939ab 100644
--- a/intern/cycles/kernel/shaders/node_sky_texture.osl
+++ b/intern/cycles/kernel/shaders/node_sky_texture.osl
@@ -122,6 +122,11 @@ vector geographical_to_direction(float lat, float lon)
return vector(cos(lat) * cos(lon), cos(lat) * sin(lon), sin(lat));
}
+float precise_angle(vector a, vector b)
+{
+ return 2.0 * atan2(length(a - b), length(a + b));
+}
+
color sky_radiance_nishita(vector dir, float nishita_data[9], string filename)
{
/* definitions */
@@ -138,7 +143,7 @@ color sky_radiance_nishita(vector dir, float nishita_data[9], string filename)
if (dir[2] >= 0.0) {
/* definitions */
vector sun_dir = geographical_to_direction(sun_elevation, sun_rotation + M_PI_2);
- float sun_dir_angle = acos(dot(dir, sun_dir));
+ float sun_dir_angle = precise_angle(dir, sun_dir);
float half_angular = angular_diameter / 2.0;
float dir_elevation = M_PI_2 - direction[0];