Commit: ce25e3e58145b703f5aeacc9f906b7ac2ca3c9c8 Author: Lukas Stockner Date: Tue Jan 24 17:33:10 2023 +0100 Branches: master https://developer.blender.org/rBce25e3e58145b703f5aeacc9f906b7ac2ca3c9c8
Cycles: Cleanup: Add general-purpose conversion between sin and cos =================================================================== M intern/cycles/kernel/closure/bsdf_hair_principled.h M intern/cycles/kernel/closure/bsdf_microfacet.h M intern/cycles/kernel/closure/bsdf_microfacet_multi.h M intern/cycles/kernel/closure/volume.h M intern/cycles/kernel/geom/curve_intersect.h M intern/cycles/kernel/integrator/mnee.h M intern/cycles/kernel/integrator/subsurface_random_walk.h M intern/cycles/kernel/light/area.h M intern/cycles/kernel/light/tree.h M intern/cycles/kernel/light/triangle.h M intern/cycles/kernel/sample/mapping.h M intern/cycles/util/math.h =================================================================== diff --git a/intern/cycles/kernel/closure/bsdf_hair_principled.h b/intern/cycles/kernel/closure/bsdf_hair_principled.h index a9e8abe0475..f7cf3b716f6 100644 --- a/intern/cycles/kernel/closure/bsdf_hair_principled.h +++ b/intern/cycles/kernel/closure/bsdf_hair_principled.h @@ -41,11 +41,6 @@ static_assert(sizeof(ShaderClosure) >= sizeof(PrincipledHairBSDF), static_assert(sizeof(ShaderClosure) >= sizeof(PrincipledHairExtra), "PrincipledHairExtra is too large!"); -ccl_device_inline float cos_from_sin(const float s) -{ - return safe_sqrtf(1.0f - s * s); -} - /* Gives the change in direction in the normal plane for the given angles and p-th-order * scattering. */ ccl_device_inline float delta_phi(int p, float gamma_o, float gamma_t) diff --git a/intern/cycles/kernel/closure/bsdf_microfacet.h b/intern/cycles/kernel/closure/bsdf_microfacet.h index 80c47bc9542..db53a29cfc3 100644 --- a/intern/cycles/kernel/closure/bsdf_microfacet.h +++ b/intern/cycles/kernel/closure/bsdf_microfacet.h @@ -200,7 +200,7 @@ ccl_device_forceinline float3 microfacet_sample_stretched(KernelGlobals kg, if (wi_.z < 0.99999f) { costheta_ = wi_.z; - sintheta_ = safe_sqrtf(1.0f - costheta_ * costheta_); + sintheta_ = sin_from_cos(costheta_); float invlen = 1.0f / sintheta_; cosphi_ = wi_.x * invlen; diff --git a/intern/cycles/kernel/closure/bsdf_microfacet_multi.h b/intern/cycles/kernel/closure/bsdf_microfacet_multi.h index 51fcd3340c6..defc46a389f 100644 --- a/intern/cycles/kernel/closure/bsdf_microfacet_multi.h +++ b/intern/cycles/kernel/closure/bsdf_microfacet_multi.h @@ -43,7 +43,7 @@ ccl_device_forceinline float2 mf_sampleP22_11(const float cosI, return make_float2(r * cosf(phi), r * sinf(phi)); } - const float sinI = safe_sqrtf(1.0f - cosI * cosI); + const float sinI = sin_from_cos(cosI); const float tanI = sinI / cosI; const float projA = 0.5f * (cosI + 1.0f); if (projA < 0.0001f) diff --git a/intern/cycles/kernel/closure/volume.h b/intern/cycles/kernel/closure/volume.h index e6af2c01fcc..a9a28c2fa4a 100644 --- a/intern/cycles/kernel/closure/volume.h +++ b/intern/cycles/kernel/closure/volume.h @@ -88,7 +88,7 @@ henyey_greenstrein_sample(float3 D, float g, float randu, float randv, ccl_priva } } - float sin_theta = safe_sqrtf(1.0f - cos_theta * cos_theta); + float sin_theta = sin_from_cos(cos_theta); float phi = M_2PI_F * randv; float3 dir = make_float3(sin_theta * cosf(phi), sin_theta * sinf(phi), cos_theta); diff --git a/intern/cycles/kernel/geom/curve_intersect.h b/intern/cycles/kernel/geom/curve_intersect.h index 747d4ba4c3f..e8ce0c58c1e 100644 --- a/intern/cycles/kernel/geom/curve_intersect.h +++ b/intern/cycles/kernel/geom/curve_intersect.h @@ -720,7 +720,7 @@ ccl_device_inline void curve_shader_setup(KernelGlobals kg, const float3 tangent = normalize(dPdu); const float3 bitangent = normalize(cross(tangent, -D)); const float sine = sd->v; - const float cosine = safe_sqrtf(1.0f - sine * sine); + const float cosine = cos_from_sin(sine); sd->N = normalize(sine * bitangent - cosine * normalize(cross(tangent, bitangent))); # if 0 diff --git a/intern/cycles/kernel/integrator/mnee.h b/intern/cycles/kernel/integrator/mnee.h index b6b07ad83a1..f50e3bc6e0c 100644 --- a/intern/cycles/kernel/integrator/mnee.h +++ b/intern/cycles/kernel/integrator/mnee.h @@ -704,9 +704,9 @@ ccl_device_forceinline bool mnee_compute_transfer_matrix(ccl_private const Shade float ilo = -eta * ilh; float cos_theta = dot(wo, m.n); - float sin_theta = safe_sqrtf(1.f - sqr(cos_theta)); + float sin_theta = sin_from_cos(cos_theta); float cos_phi = dot(wo, s); - float sin_phi = safe_sqrtf(1.f - sqr(cos_phi)); + float sin_phi = sin_from_cos(cos_phi); /* Wo = (cos_phi * sin_theta) * s + (sin_phi * sin_theta) * t + cos_theta * n. */ float3 dH_dtheta = ilo * (cos_theta * (cos_phi * s + sin_phi * t) - sin_theta * m.n); diff --git a/intern/cycles/kernel/integrator/subsurface_random_walk.h b/intern/cycles/kernel/integrator/subsurface_random_walk.h index fdcb66c32f5..70e2920349f 100644 --- a/intern/cycles/kernel/integrator/subsurface_random_walk.h +++ b/intern/cycles/kernel/integrator/subsurface_random_walk.h @@ -136,7 +136,7 @@ ccl_device_forceinline float diffusion_length_dwivedi(float alpha) ccl_device_forceinline float3 direction_from_cosine(float3 D, float cos_theta, float randv) { - float sin_theta = safe_sqrtf(1.0f - cos_theta * cos_theta); + float sin_theta = sin_from_cos(cos_theta); float phi = M_2PI_F * randv; float3 dir = make_float3(sin_theta * cosf(phi), sin_theta * sinf(phi), cos_theta); diff --git a/intern/cycles/kernel/light/area.h b/intern/cycles/kernel/light/area.h index 9c0ca0c8a70..a4badf907a0 100644 --- a/intern/cycles/kernel/light/area.h +++ b/intern/cycles/kernel/light/area.h @@ -102,7 +102,7 @@ ccl_device float area_light_spread_attenuation(const float3 D, /* The factor M_PI_F comes from integrating the radiance over the hemisphere */ return (cos_a > 0.9999997f) ? M_PI_F : 0.0f; } - const float sin_a = safe_sqrtf(1.0f - sqr(cos_a)); + const float sin_a = sin_from_cos(cos_a); const float tan_a = sin_a / cos_a; return max((tan_half_spread - tan_a) * normalize_spread, 0.0f); } diff --git a/intern/cycles/kernel/light/tree.h b/intern/cycles/kernel/light/tree.h index 423879bcddc..441e9758088 100644 --- a/intern/cycles/kernel/light/tree.h +++ b/intern/cycles/kernel/light/tree.h @@ -47,11 +47,6 @@ ccl_device float light_tree_cos_bounding_box_angle(const BoundingBox bbox, return cos_theta_u; } -ccl_device_forceinline float sin_from_cos(const float c) -{ - return safe_sqrtf(1.0f - sqr(c)); -} - /* Compute vector v as in Fig .8. P_v is the corresponding point along the ray. */ ccl_device float3 compute_v( const float3 centroid, const float3 P, const float3 D, const float3 bcone_axis, const float t) diff --git a/intern/cycles/kernel/light/triangle.h b/intern/cycles/kernel/light/triangle.h index 298a94566fc..b6724c6d6e1 100644 --- a/intern/cycles/kernel/light/triangle.h +++ b/intern/cycles/kernel/light/triangle.h @@ -218,7 +218,7 @@ ccl_device_forceinline bool triangle_light_sample(KernelGlobals kg, /* Finally, select a random point along the edge of the new triangle * That point on the spherical triangle is the sampled ray direction */ const float z = 1.0f - randv * (1.0f - dot(C_, B)); - ls->D = z * B + safe_sqrtf(1.0f - z * z) * safe_normalize(C_ - dot(C_, B) * B); + ls->D = z * B + sin_from_cos(z) * safe_normalize(C_ - dot(C_, B) * B); /* calculate intersection with the planar triangle */ if (!ray_triangle_intersect( diff --git a/intern/cycles/kernel/sample/mapping.h b/intern/cycles/kernel/sample/mapping.h index 94e691aa1a8..1cd7bce11d2 100644 --- a/intern/cycles/kernel/sample/mapping.h +++ b/intern/cycles/kernel/sample/mapping.h @@ -67,17 +67,18 @@ ccl_device_inline void sample_uniform_cone(const float3 N, ccl_private float3 *wo, ccl_private float *pdf) { - float zMin = cosf(angle); - float z = zMin - zMin * randu + randu; - float r = safe_sqrtf(1.0f - sqr(z)); - float phi = M_2PI_F * randv; - float x = r * cosf(phi); - float y = r * sinf(phi); + const float cosThetaMin = cosf(angle); + const float cosTheta = mix(cosThetaMin, 1.0f, randu); + const float sinTheta = sin_from_cos(cosTheta); + const float phi = M_2PI_F * randv; + const float x = sinTheta * cosf(phi); + const float y = sinTheta * sinf(phi); + const float z = cosTheta; float3 T, B; make_orthonormals(N, &T, &B); *wo = x * T + y * B + z * N; - *pdf = M_1_2PI_F / (1.0f - zMin); + *pdf = M_1_2PI_F / (1.0f - cosThetaMin); } ccl_device_inline float pdf_uniform_cone(const float3 N, float3 D, float angle) diff --git a/intern/cycles/util/math.h b/intern/cycles/util/math.h index 2eeb4aebd54..3618daa4ccb 100644 --- a/intern/cycles/util/math.h +++ b/intern/cycles/util/math.h @@ -750,6 +750,16 @@ ccl_device_inline float sqr(float a) return a * a; } +ccl_device_inline float sin_from_cos(const float c) +{ + return safe_sqrtf(1.0f - sqr(c)); +} + +ccl_device_inline float cos_from_sin(const float s) +{ + return safe_sqrtf(1.0f - sqr(s)); +} + ccl_device_inline float pow20(float a) { return sqr(sqr(sqr(sqr(a)) * a)); _______________________________________________ Bf-blender-cvs mailing list Bf-blender-cvs@blender.org List details, subscription details or unsubscribe: https://lists.blender.org/mailman/listinfo/bf-blender-cvs