Changeset View
Changeset View
Standalone View
Standalone View
intern/cycles/kernel/closure/bsdf_microfacet.h
| Show All 10 Lines | |||||
| #include "kernel/closure/bsdf_util.h" | #include "kernel/closure/bsdf_util.h" | ||||
| #include "kernel/sample/pattern.h" | #include "kernel/sample/pattern.h" | ||||
| #include "kernel/util/lookup_table.h" | #include "kernel/util/lookup_table.h" | ||||
| CCL_NAMESPACE_BEGIN | CCL_NAMESPACE_BEGIN | ||||
| enum MicrofacetType { | |||||
| BECKMANN, | |||||
| GGX, | |||||
| }; | |||||
| typedef struct MicrofacetExtra { | typedef struct MicrofacetExtra { | ||||
| Spectrum color, cspec0; | Spectrum color, cspec0; | ||||
| Spectrum fresnel_color; | Spectrum fresnel_color; | ||||
| float clearcoat; | float clearcoat; | ||||
| } MicrofacetExtra; | } MicrofacetExtra; | ||||
| typedef struct MicrofacetBsdf { | typedef struct MicrofacetBsdf { | ||||
| SHADER_CLOSURE_BASE; | SHADER_CLOSURE_BASE; | ||||
| ▲ Show 20 Lines • Show All 143 Lines • ▼ Show 20 Lines | else { | ||||
| randv = 2.0f * (0.5f - randv); | randv = 2.0f * (0.5f - randv); | ||||
| } | } | ||||
| const float z = (randv * (randv * (randv * 0.27385f - 0.73369f) + 0.46341f)) / | const float z = (randv * (randv * (randv * 0.27385f - 0.73369f) + 0.46341f)) / | ||||
| (randv * (randv * (randv * 0.093073f + 0.309420f) - 1.000000f) + 0.597999f); | (randv * (randv * (randv * 0.093073f + 0.309420f) - 1.000000f) + 0.597999f); | ||||
| *slope_y = S * z * safe_sqrtf(1.0f + (*slope_x) * (*slope_x)); | *slope_y = S * z * safe_sqrtf(1.0f + (*slope_x) * (*slope_x)); | ||||
| } | } | ||||
| template<MicrofacetType m_type> | |||||
| ccl_device_forceinline float3 microfacet_sample_stretched(KernelGlobals kg, | ccl_device_forceinline float3 microfacet_sample_stretched(KernelGlobals kg, | ||||
| const float3 wi, | const float3 wi, | ||||
| const float alpha_x, | const float alpha_x, | ||||
| const float alpha_y, | const float alpha_y, | ||||
| const float randu, | const float randu, | ||||
| const float randv, | const float randv, | ||||
| bool beckmann, | |||||
| ccl_private float *G1i) | ccl_private float *G1i) | ||||
| { | { | ||||
| /* 1. stretch wi */ | /* 1. stretch wi */ | ||||
| float3 wi_ = make_float3(alpha_x * wi.x, alpha_y * wi.y, wi.z); | float3 wi_ = make_float3(alpha_x * wi.x, alpha_y * wi.y, wi.z); | ||||
| wi_ = normalize(wi_); | wi_ = normalize(wi_); | ||||
| /* Compute polar coordinates of wi_. */ | /* Compute polar coordinates of wi_. */ | ||||
| float costheta_ = 1.0f; | float costheta_ = 1.0f; | ||||
| float sintheta_ = 0.0f; | float sintheta_ = 0.0f; | ||||
| float cosphi_ = 1.0f; | float cosphi_ = 1.0f; | ||||
| float sinphi_ = 0.0f; | float sinphi_ = 0.0f; | ||||
| if (wi_.z < 0.99999f) { | if (wi_.z < 0.99999f) { | ||||
| costheta_ = wi_.z; | costheta_ = wi_.z; | ||||
| sintheta_ = safe_sqrtf(1.0f - costheta_ * costheta_); | sintheta_ = safe_sqrtf(1.0f - costheta_ * costheta_); | ||||
| float invlen = 1.0f / sintheta_; | float invlen = 1.0f / sintheta_; | ||||
| cosphi_ = wi_.x * invlen; | cosphi_ = wi_.x * invlen; | ||||
| sinphi_ = wi_.y * invlen; | sinphi_ = wi_.y * invlen; | ||||
| } | } | ||||
| /* 2. sample P22_{wi}(x_slope, y_slope, 1, 1) */ | /* 2. sample P22_{wi}(x_slope, y_slope, 1, 1) */ | ||||
| float slope_x, slope_y; | float slope_x, slope_y; | ||||
| if (beckmann) { | if constexpr (m_type == MicrofacetType::BECKMANN) { | ||||
| microfacet_beckmann_sample_slopes( | microfacet_beckmann_sample_slopes( | ||||
| kg, costheta_, sintheta_, randu, randv, &slope_x, &slope_y, G1i); | kg, costheta_, sintheta_, randu, randv, &slope_x, &slope_y, G1i); | ||||
| } | } | ||||
| else { | else { | ||||
| microfacet_ggx_sample_slopes(costheta_, sintheta_, randu, randv, &slope_x, &slope_y, G1i); | microfacet_ggx_sample_slopes(costheta_, sintheta_, randu, randv, &slope_x, &slope_y, G1i); | ||||
| } | } | ||||
| /* 3. rotate */ | /* 3. rotate */ | ||||
| ▲ Show 20 Lines • Show All 45 Lines • ▼ Show 20 Lines | if (alpha2 >= 1.0f) { | ||||
| return M_1_PI_F; | return M_1_PI_F; | ||||
| } | } | ||||
| const float t = 1.0f + (alpha2 - 1.0f) * cos_NH * cos_NH; | const float t = 1.0f + (alpha2 - 1.0f) * cos_NH * cos_NH; | ||||
| return (alpha2 - 1.0f) / (M_PI_F * logf(alpha2) * t); | return (alpha2 - 1.0f) / (M_PI_F * logf(alpha2) * t); | ||||
| } | } | ||||
| /* Monodirectional shadowing-masking term. */ | /* Monodirectional shadowing-masking term. */ | ||||
| template<bool beckmann> ccl_device_inline float bsdf_G1_from_sqr_alpha_tan_n(float sqr_alpha_tan_n) | template<MicrofacetType m_type> | ||||
| ccl_device_inline float bsdf_G1_from_sqr_alpha_tan_n(float sqr_alpha_tan_n) | |||||
| { | { | ||||
| if (!beckmann) { /* GGX. */ | if constexpr (m_type == MicrofacetType::GGX) { | ||||
| return 2.0f / (1.0f + sqrtf(1.0f + sqr_alpha_tan_n)); | return 2.0f / (1.0f + sqrtf(1.0f + sqr_alpha_tan_n)); | ||||
| } | } | ||||
| /* m_type == MicrofacetType::BECKMANN */ | |||||
| const float a = inversesqrtf(sqr_alpha_tan_n); | const float a = inversesqrtf(sqr_alpha_tan_n); | ||||
| return (a > 1.6f) ? 1.0f : ((2.181f * a + 3.535f) * a) / ((2.577f * a + 2.276f) * a + 1.0f); | return (a > 1.6f) ? 1.0f : ((2.181f * a + 3.535f) * a) / ((2.577f * a + 2.276f) * a + 1.0f); | ||||
| } | } | ||||
| template<bool beckmann> ccl_device_inline float bsdf_G1(float alpha2, float cos_N) | template<MicrofacetType m_type> ccl_device_inline float bsdf_G1(float alpha2, float cos_N) | ||||
| { | { | ||||
| return bsdf_G1_from_sqr_alpha_tan_n<beckmann>(alpha2 * | return bsdf_G1_from_sqr_alpha_tan_n<m_type>(alpha2 * fmaxf(1.0f / (cos_N * cos_N) - 1.0f, 0.0f)); | ||||
| fmaxf(1.0f / (cos_N * cos_N) - 1.0f, 0.0f)); | |||||
| } | } | ||||
| template<bool beckmann> | template<MicrofacetType m_type> | ||||
| ccl_device_inline float bsdf_aniso_G1(float alpha_x, float alpha_y, float3 V) | ccl_device_inline float bsdf_aniso_G1(float alpha_x, float alpha_y, float3 V) | ||||
| { | { | ||||
| return bsdf_G1_from_sqr_alpha_tan_n<beckmann>((sqr(alpha_x * V.x) + sqr(alpha_y * V.y)) / | return bsdf_G1_from_sqr_alpha_tan_n<m_type>((sqr(alpha_x * V.x) + sqr(alpha_y * V.y)) / | ||||
| sqr(V.z)); | sqr(V.z)); | ||||
| } | } | ||||
| /* Smith's separable shadowing-masking term. */ | /* Smith's separable shadowing-masking term. */ | ||||
| template<bool beckmann> ccl_device_inline float bsdf_G(float alpha2, float cos_NI, float cos_NO) | template<MicrofacetType m_type> | ||||
| ccl_device_inline float bsdf_G(float alpha2, float cos_NI, float cos_NO) | |||||
| { | { | ||||
| return bsdf_G1<beckmann>(alpha2, cos_NI) * bsdf_G1<beckmann>(alpha2, cos_NO); | return bsdf_G1<m_type>(alpha2, cos_NI) * bsdf_G1<m_type>(alpha2, cos_NO); | ||||
| } | } | ||||
| /* Normal distribution function. */ | /* Normal distribution function. */ | ||||
| template<bool beckmann> ccl_device_inline float bsdf_D(float alpha2, float cos_NH) | template<MicrofacetType m_type> ccl_device_inline float bsdf_D(float alpha2, float cos_NH) | ||||
| { | { | ||||
| const float cos_NH2 = sqr(cos_NH); | const float cos_NH2 = sqr(cos_NH); | ||||
| return beckmann ? expf((1.0f - 1.0f / cos_NH2) / alpha2) / (M_PI_F * alpha2 * sqr(cos_NH2)) : | if constexpr (m_type == MicrofacetType::BECKMANN) { | ||||
| alpha2 / (M_PI_F * sqr(1.0f + (alpha2 - 1.0f) * cos_NH2)); | return expf((1.0f - 1.0f / cos_NH2) / alpha2) / (M_PI_F * alpha2 * sqr(cos_NH2)); | ||||
| } | |||||
| /* m_type == MicrofacetType::GGX */ | |||||
| return alpha2 / (M_PI_F * sqr(1.0f + (alpha2 - 1.0f) * cos_NH2)); | |||||
| } | } | ||||
| template<bool beckmann> | template<MicrofacetType m_type> | ||||
| ccl_device_inline float bsdf_aniso_D(float alpha_x, float alpha_y, float3 H) | ccl_device_inline float bsdf_aniso_D(float alpha_x, float alpha_y, float3 H) | ||||
| { | { | ||||
| H /= make_float3(alpha_x, alpha_y, 1.0f); | H /= make_float3(alpha_x, alpha_y, 1.0f); | ||||
| const float cos_NH2 = sqr(H.z); | const float cos_NH2 = sqr(H.z); | ||||
| const float alpha2 = alpha_x * alpha_y; | const float alpha2 = alpha_x * alpha_y; | ||||
| return beckmann ? expf(-(sqr(H.x) + sqr(H.y)) / cos_NH2) / (M_PI_F * alpha2 * sqr(cos_NH2)) : | if constexpr (m_type == MicrofacetType::BECKMANN) { | ||||
| M_1_PI_F / (alpha2 * sqr(len_squared(H))); | return expf(-(sqr(H.x) + sqr(H.y)) / cos_NH2) / (M_PI_F * alpha2 * sqr(cos_NH2)); | ||||
| } | |||||
| /* m_type == MicrofacetType::GGX */ | |||||
| return M_1_PI_F / (alpha2 * sqr(len_squared(H))); | |||||
| } | } | ||||
| ccl_device_forceinline void bsdf_microfacet_fresnel_color(ccl_private const ShaderData *sd, | ccl_device_forceinline void bsdf_microfacet_fresnel_color(ccl_private const ShaderData *sd, | ||||
| ccl_private MicrofacetBsdf *bsdf) | ccl_private MicrofacetBsdf *bsdf) | ||||
| { | { | ||||
| kernel_assert(CLOSURE_IS_BSDF_MICROFACET_FRESNEL(bsdf->type)); | kernel_assert(CLOSURE_IS_BSDF_MICROFACET_FRESNEL(bsdf->type)); | ||||
| float F0 = fresnel_dielectric_cos(1.0f, bsdf->ior); | float F0 = fresnel_dielectric_cos(1.0f, bsdf->ior); | ||||
| bsdf->extra->fresnel_color = interpolate_fresnel_color( | bsdf->extra->fresnel_color = interpolate_fresnel_color( | ||||
| sd->wi, bsdf->N, bsdf->ior, F0, bsdf->extra->cspec0); | sd->wi, bsdf->N, bsdf->ior, F0, bsdf->extra->cspec0); | ||||
| if (bsdf->type == CLOSURE_BSDF_MICROFACET_GGX_CLEARCOAT_ID) { | if (bsdf->type == CLOSURE_BSDF_MICROFACET_GGX_CLEARCOAT_ID) { | ||||
| bsdf->extra->fresnel_color *= 0.25f * bsdf->extra->clearcoat; | bsdf->extra->fresnel_color *= 0.25f * bsdf->extra->clearcoat; | ||||
| } | } | ||||
| bsdf->sample_weight *= average(bsdf->extra->fresnel_color); | bsdf->sample_weight *= average(bsdf->extra->fresnel_color); | ||||
| } | } | ||||
| template<bool beckmann> | template<MicrofacetType m_type> | ||||
| ccl_device Spectrum bsdf_microfacet_eval(ccl_private const ShaderClosure *sc, | ccl_device Spectrum bsdf_microfacet_eval(ccl_private const ShaderClosure *sc, | ||||
| const float3 Ng, | const float3 Ng, | ||||
| const float3 wi, | const float3 wi, | ||||
| const float3 wo, | const float3 wo, | ||||
| ccl_private float *pdf) | ccl_private float *pdf) | ||||
| { | { | ||||
| ccl_private const MicrofacetBsdf *bsdf = (ccl_private const MicrofacetBsdf *)sc; | ccl_private const MicrofacetBsdf *bsdf = (ccl_private const MicrofacetBsdf *)sc; | ||||
| const bool m_refractive = (bsdf->type == CLOSURE_BSDF_MICROFACET_BECKMANN_REFRACTION_ID) || | const bool m_refractive = (bsdf->type == CLOSURE_BSDF_MICROFACET_BECKMANN_REFRACTION_ID) || | ||||
| Show All 28 Lines | if (alpha_x == alpha_y || m_refractive) { /* Isotropic. */ | ||||
| if (bsdf->type == CLOSURE_BSDF_MICROFACET_GGX_CLEARCOAT_ID) { | if (bsdf->type == CLOSURE_BSDF_MICROFACET_GGX_CLEARCOAT_ID) { | ||||
| D = bsdf_clearcoat_D(alpha2, cos_NH); | D = bsdf_clearcoat_D(alpha2, cos_NH); | ||||
| /* The masking-shadowing term for clearcoat has a fixed alpha of 0.25 | /* The masking-shadowing term for clearcoat has a fixed alpha of 0.25 | ||||
| * => alpha2 = 0.25 * 0.25 */ | * => alpha2 = 0.25 * 0.25 */ | ||||
| alpha2 = 0.0625f; | alpha2 = 0.0625f; | ||||
| } | } | ||||
| else { | else { | ||||
| D = bsdf_D<beckmann>(alpha2, cos_NH); | D = bsdf_D<m_type>(alpha2, cos_NH); | ||||
| } | } | ||||
| G1i = bsdf_G1<beckmann>(alpha2, cos_NI); | G1i = bsdf_G1<m_type>(alpha2, cos_NI); | ||||
| G1o = bsdf_G1<beckmann>(alpha2, cos_NO); | G1o = bsdf_G1<m_type>(alpha2, cos_NO); | ||||
| } | } | ||||
| else { /* Anisotropic. */ | else { /* Anisotropic. */ | ||||
| float3 X, Y; | float3 X, Y; | ||||
| make_orthonormals_tangent(N, bsdf->T, &X, &Y); | make_orthonormals_tangent(N, bsdf->T, &X, &Y); | ||||
| const float3 local_H = make_float3(dot(X, H), dot(Y, H), cos_NH); | const float3 local_H = make_float3(dot(X, H), dot(Y, H), cos_NH); | ||||
| const float3 local_I = make_float3(dot(X, wi), dot(Y, wi), cos_NI); | const float3 local_I = make_float3(dot(X, wi), dot(Y, wi), cos_NI); | ||||
| const float3 local_O = make_float3(dot(X, wo), dot(Y, wo), cos_NO); | const float3 local_O = make_float3(dot(X, wo), dot(Y, wo), cos_NO); | ||||
| D = bsdf_aniso_D<beckmann>(alpha_x, alpha_y, local_H); | D = bsdf_aniso_D<m_type>(alpha_x, alpha_y, local_H); | ||||
| G1i = bsdf_aniso_G1<beckmann>(alpha_x, alpha_y, local_I); | G1i = bsdf_aniso_G1<m_type>(alpha_x, alpha_y, local_I); | ||||
| G1o = bsdf_aniso_G1<beckmann>(alpha_x, alpha_y, local_O); | G1o = bsdf_aniso_G1<m_type>(alpha_x, alpha_y, local_O); | ||||
| } | } | ||||
| const float common = G1i * D / cos_NI * | const float common = G1i * D / cos_NI * | ||||
| (m_refractive ? | (m_refractive ? | ||||
| sqr(bsdf->ior * inv_len_H) * fabsf(dot(H, wi) * dot(H, wo)) : | sqr(bsdf->ior * inv_len_H) * fabsf(dot(H, wi) * dot(H, wo)) : | ||||
| 0.25f); | 0.25f); | ||||
| *pdf = common; | *pdf = common; | ||||
| const Spectrum F = m_refractive ? one_spectrum() : reflection_color(bsdf, wo, H); | const Spectrum F = m_refractive ? one_spectrum() : reflection_color(bsdf, wo, H); | ||||
| return F * G1o * common; | return F * G1o * common; | ||||
| } | } | ||||
| template<bool beckmann> | template<MicrofacetType m_type> | ||||
| ccl_device int bsdf_microfacet_sample(KernelGlobals kg, | ccl_device int bsdf_microfacet_sample(KernelGlobals kg, | ||||
| ccl_private const ShaderClosure *sc, | ccl_private const ShaderClosure *sc, | ||||
| float3 Ng, | float3 Ng, | ||||
| float3 wi, | float3 wi, | ||||
| float randu, | float randu, | ||||
| float randv, | float randv, | ||||
| ccl_private Spectrum *eval, | ccl_private Spectrum *eval, | ||||
| ccl_private float3 *wo, | ccl_private float3 *wo, | ||||
| Show All 23 Lines | ccl_device int bsdf_microfacet_sample(KernelGlobals kg, | ||||
| else { | else { | ||||
| make_orthonormals_tangent(N, bsdf->T, &X, &Y); | make_orthonormals_tangent(N, bsdf->T, &X, &Y); | ||||
| } | } | ||||
| /* Importance sampling with distribution of visible normals. Vectors are transformed to local | /* Importance sampling with distribution of visible normals. Vectors are transformed to local | ||||
| * space before and after sampling. */ | * space before and after sampling. */ | ||||
| float G1i; | float G1i; | ||||
| const float3 local_I = make_float3(dot(X, wi), dot(Y, wi), cos_NI); | const float3 local_I = make_float3(dot(X, wi), dot(Y, wi), cos_NI); | ||||
| const float3 local_H = microfacet_sample_stretched( | const float3 local_H = microfacet_sample_stretched<m_type>( | ||||
| kg, local_I, alpha_x, alpha_y, randu, randv, beckmann, &G1i); | kg, local_I, alpha_x, alpha_y, randu, randv, &G1i); | ||||
| const float3 H = X * local_H.x + Y * local_H.y + N * local_H.z; | const float3 H = X * local_H.x + Y * local_H.y + N * local_H.z; | ||||
| const float cos_NH = local_H.z; | const float cos_NH = local_H.z; | ||||
| const float cos_HI = dot(H, wi); | const float cos_HI = dot(H, wi); | ||||
| bool valid = beckmann; | bool valid = false; | ||||
| if (m_refractive) { | if (m_refractive) { | ||||
| float3 R, T; | float3 R, T; | ||||
| bool inside; | bool inside; | ||||
| float fresnel = fresnel_dielectric(m_eta, H, wi, &R, &T, &inside); | float fresnel = fresnel_dielectric(m_eta, H, wi, &R, &T, &inside); | ||||
| *wo = T; | *wo = T; | ||||
| valid = !inside && fresnel != 1.0f; | valid = !inside && fresnel != 1.0f; | ||||
| Show All 36 Lines | if (alpha_x == alpha_y || m_refractive) { /* Isotropic. */ | ||||
| if (bsdf->type == CLOSURE_BSDF_MICROFACET_GGX_CLEARCOAT_ID) { | if (bsdf->type == CLOSURE_BSDF_MICROFACET_GGX_CLEARCOAT_ID) { | ||||
| D = bsdf_clearcoat_D(alpha2, cos_NH); | D = bsdf_clearcoat_D(alpha2, cos_NH); | ||||
| /* The masking-shadowing term for clearcoat has a fixed alpha of 0.25 | /* The masking-shadowing term for clearcoat has a fixed alpha of 0.25 | ||||
| * => alpha2 = 0.25 * 0.25 */ | * => alpha2 = 0.25 * 0.25 */ | ||||
| alpha2 = 0.0625f; | alpha2 = 0.0625f; | ||||
| /* Recalculate G1i. */ | /* Recalculate G1i. */ | ||||
| G1i = bsdf_G1<beckmann>(alpha2, cos_NI); | G1i = bsdf_G1<m_type>(alpha2, cos_NI); | ||||
| } | } | ||||
| else { | else { | ||||
| D = bsdf_D<beckmann>(alpha2, cos_NH); | D = bsdf_D<m_type>(alpha2, cos_NH); | ||||
| } | } | ||||
| G1o = bsdf_G1<beckmann>(alpha2, cos_NO); | G1o = bsdf_G1<m_type>(alpha2, cos_NO); | ||||
| } | } | ||||
| else { /* Anisotropic. */ | else { /* Anisotropic. */ | ||||
| const float3 local_O = make_float3(dot(X, *wo), dot(Y, *wo), cos_NO); | const float3 local_O = make_float3(dot(X, *wo), dot(Y, *wo), cos_NO); | ||||
| D = bsdf_aniso_D<beckmann>(alpha_x, alpha_y, local_H); | D = bsdf_aniso_D<m_type>(alpha_x, alpha_y, local_H); | ||||
| G1o = bsdf_aniso_G1<beckmann>(alpha_x, alpha_y, local_O); | G1o = bsdf_aniso_G1<m_type>(alpha_x, alpha_y, local_O); | ||||
| } | } | ||||
| const float cos_HO = dot(H, *wo); | const float cos_HO = dot(H, *wo); | ||||
| const float common = G1i * D / cos_NI * | const float common = G1i * D / cos_NI * | ||||
| (m_refractive ? fabsf(cos_HI * cos_HO) / sqr(cos_HO + cos_HI / m_eta) : | (m_refractive ? fabsf(cos_HI * cos_HO) / sqr(cos_HO + cos_HI / m_eta) : | ||||
| 0.25f); | 0.25f); | ||||
| *pdf = common; | *pdf = common; | ||||
| ▲ Show 20 Lines • Show All 93 Lines • ▼ Show 20 Lines | |||||
| } | } | ||||
| ccl_device Spectrum bsdf_microfacet_ggx_eval(ccl_private const ShaderClosure *sc, | ccl_device Spectrum bsdf_microfacet_ggx_eval(ccl_private const ShaderClosure *sc, | ||||
| const float3 Ng, | const float3 Ng, | ||||
| const float3 wi, | const float3 wi, | ||||
| const float3 wo, | const float3 wo, | ||||
| ccl_private float *pdf) | ccl_private float *pdf) | ||||
| { | { | ||||
| return bsdf_microfacet_eval<false>(sc, Ng, wi, wo, pdf); | return bsdf_microfacet_eval<MicrofacetType::GGX>(sc, Ng, wi, wo, pdf); | ||||
| } | } | ||||
| ccl_device int bsdf_microfacet_ggx_sample(KernelGlobals kg, | ccl_device int bsdf_microfacet_ggx_sample(KernelGlobals kg, | ||||
| ccl_private const ShaderClosure *sc, | ccl_private const ShaderClosure *sc, | ||||
| float3 Ng, | float3 Ng, | ||||
| float3 wi, | float3 wi, | ||||
| float randu, | float randu, | ||||
| float randv, | float randv, | ||||
| ccl_private Spectrum *eval, | ccl_private Spectrum *eval, | ||||
| ccl_private float3 *wo, | ccl_private float3 *wo, | ||||
| ccl_private float *pdf, | ccl_private float *pdf, | ||||
| ccl_private float2 *sampled_roughness, | ccl_private float2 *sampled_roughness, | ||||
| ccl_private float *eta) | ccl_private float *eta) | ||||
| { | { | ||||
| return bsdf_microfacet_sample<false>( | return bsdf_microfacet_sample<MicrofacetType::GGX>( | ||||
| kg, sc, Ng, wi, randu, randv, eval, wo, pdf, sampled_roughness, eta); | kg, sc, Ng, wi, randu, randv, eval, wo, pdf, sampled_roughness, eta); | ||||
| } | } | ||||
| /* Beckmann microfacet with Smith shadow-masking from: | /* Beckmann microfacet with Smith shadow-masking from: | ||||
| * | * | ||||
| * Microfacet Models for Refraction through Rough Surfaces | * Microfacet Models for Refraction through Rough Surfaces | ||||
| * B. Walter, S. R. Marschner, H. Li, K. E. Torrance, EGSR 2007 */ | * B. Walter, S. R. Marschner, H. Li, K. E. Torrance, EGSR 2007 */ | ||||
| Show All 32 Lines | |||||
| } | } | ||||
| ccl_device Spectrum bsdf_microfacet_beckmann_eval(ccl_private const ShaderClosure *sc, | ccl_device Spectrum bsdf_microfacet_beckmann_eval(ccl_private const ShaderClosure *sc, | ||||
| const float3 Ng, | const float3 Ng, | ||||
| const float3 wi, | const float3 wi, | ||||
| const float3 wo, | const float3 wo, | ||||
| ccl_private float *pdf) | ccl_private float *pdf) | ||||
| { | { | ||||
| return bsdf_microfacet_eval<true>(sc, Ng, wi, wo, pdf); | return bsdf_microfacet_eval<MicrofacetType::BECKMANN>(sc, Ng, wi, wo, pdf); | ||||
| } | } | ||||
| ccl_device int bsdf_microfacet_beckmann_sample(KernelGlobals kg, | ccl_device int bsdf_microfacet_beckmann_sample(KernelGlobals kg, | ||||
| ccl_private const ShaderClosure *sc, | ccl_private const ShaderClosure *sc, | ||||
| float3 Ng, | float3 Ng, | ||||
| float3 wi, | float3 wi, | ||||
| float randu, | float randu, | ||||
| float randv, | float randv, | ||||
| ccl_private Spectrum *eval, | ccl_private Spectrum *eval, | ||||
| ccl_private float3 *wo, | ccl_private float3 *wo, | ||||
| ccl_private float *pdf, | ccl_private float *pdf, | ||||
| ccl_private float2 *sampled_roughness, | ccl_private float2 *sampled_roughness, | ||||
| ccl_private float *eta) | ccl_private float *eta) | ||||
| { | { | ||||
| return bsdf_microfacet_sample<true>( | return bsdf_microfacet_sample<MicrofacetType::BECKMANN>( | ||||
| kg, sc, Ng, wi, randu, randv, eval, wo, pdf, sampled_roughness, eta); | kg, sc, Ng, wi, randu, randv, eval, wo, pdf, sampled_roughness, eta); | ||||
| } | } | ||||
| CCL_NAMESPACE_END | CCL_NAMESPACE_END | ||||