Changeset View
Changeset View
Standalone View
Standalone View
intern/cycles/kernel/closure/bsdf_microfacet.h
| Show First 20 Lines • Show All 49 Lines • ▼ Show 20 Lines | typedef struct MicrofacetBsdf { | ||||
| ccl_private MicrofacetExtra *extra; | ccl_private MicrofacetExtra *extra; | ||||
| float3 T; | float3 T; | ||||
| } MicrofacetBsdf; | } MicrofacetBsdf; | ||||
| static_assert(sizeof(ShaderClosure) >= sizeof(MicrofacetBsdf), "MicrofacetBsdf is too large!"); | static_assert(sizeof(ShaderClosure) >= sizeof(MicrofacetBsdf), "MicrofacetBsdf is too large!"); | ||||
| /* Beckmann and GGX microfacet importance sampling. */ | /* Beckmann and GGX microfacet importance sampling. */ | ||||
| ccl_device_inline void microfacet_beckmann_sample_slopes(ccl_global const KernelGlobals *kg, | ccl_device_inline void microfacet_beckmann_sample_slopes(KernelGlobals kg, | ||||
| const float cos_theta_i, | const float cos_theta_i, | ||||
| const float sin_theta_i, | const float sin_theta_i, | ||||
| float randu, | float randu, | ||||
| float randv, | float randv, | ||||
| ccl_private float *slope_x, | ccl_private float *slope_x, | ||||
| ccl_private float *slope_y, | ccl_private float *slope_y, | ||||
| ccl_private float *G1i) | ccl_private float *G1i) | ||||
| { | { | ||||
| ▲ Show 20 Lines • Show All 123 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)); | ||||
| } | } | ||||
| ccl_device_forceinline float3 microfacet_sample_stretched(ccl_global const KernelGlobals *kg, | ccl_device_forceinline float3 microfacet_sample_stretched(KernelGlobals kg, | ||||
| const float3 omega_i, | const float3 omega_i, | ||||
| 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, | bool beckmann, | ||||
| ccl_private float *G1i) | ccl_private float *G1i) | ||||
| { | { | ||||
| ▲ Show 20 Lines • Show All 337 Lines • ▼ Show 20 Lines | ccl_device float3 bsdf_microfacet_ggx_eval_transmit(ccl_private const ShaderClosure *sc, | ||||
| * pdf = pm * (m_eta * m_eta) * fabsf(cosHI) / Ht2 */ | * pdf = pm * (m_eta * m_eta) * fabsf(cosHI) / Ht2 */ | ||||
| float common = D * (m_eta * m_eta) / (cosNO * Ht2); | float common = D * (m_eta * m_eta) / (cosNO * Ht2); | ||||
| float out = G * fabsf(cosHI * cosHO) * common; | float out = G * fabsf(cosHI * cosHO) * common; | ||||
| *pdf = G1o * fabsf(cosHO * cosHI) * common; | *pdf = G1o * fabsf(cosHO * cosHI) * common; | ||||
| return make_float3(out, out, out); | return make_float3(out, out, out); | ||||
| } | } | ||||
| ccl_device int bsdf_microfacet_ggx_sample(ccl_global const 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 I, | float3 I, | ||||
| float3 dIdx, | float3 dIdx, | ||||
| float3 dIdy, | float3 dIdy, | ||||
| float randu, | float randu, | ||||
| float randv, | float randv, | ||||
| ccl_private float3 *eval, | ccl_private float3 *eval, | ||||
| ▲ Show 20 Lines • Show All 411 Lines • ▼ Show 20 Lines | ccl_device float3 bsdf_microfacet_beckmann_eval_transmit(ccl_private const ShaderClosure *sc, | ||||
| * pdf = pm * (m_eta * m_eta) * fabsf(cosHI) / Ht2 */ | * pdf = pm * (m_eta * m_eta) * fabsf(cosHI) / Ht2 */ | ||||
| float common = D * (m_eta * m_eta) / (cosNO * Ht2); | float common = D * (m_eta * m_eta) / (cosNO * Ht2); | ||||
| float out = G * fabsf(cosHI * cosHO) * common; | float out = G * fabsf(cosHI * cosHO) * common; | ||||
| *pdf = G1o * fabsf(cosHO * cosHI) * common; | *pdf = G1o * fabsf(cosHO * cosHI) * common; | ||||
| return make_float3(out, out, out); | return make_float3(out, out, out); | ||||
| } | } | ||||
| ccl_device int bsdf_microfacet_beckmann_sample(ccl_global const 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 I, | float3 I, | ||||
| float3 dIdx, | float3 dIdx, | ||||
| float3 dIdy, | float3 dIdy, | ||||
| float randu, | float randu, | ||||
| float randv, | float randv, | ||||
| ccl_private float3 *eval, | ccl_private float3 *eval, | ||||
| ▲ Show 20 Lines • Show All 180 Lines • Show Last 20 Lines | |||||