Changeset View
Changeset View
Standalone View
Standalone View
intern/cycles/kernel/closure/bsdf_microfacet.h
| Show All 24 Lines | |||||
| * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | ||||
| * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, | * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, | ||||
| * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | ||||
| * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||||
| * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | ||||
| * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||||
| */ | */ | ||||
| #ifndef __BSDF_MICROFACET_H__ | #pragma once | ||||
| #define __BSDF_MICROFACET_H__ | |||||
| #include "kernel/kernel_lookup_table.h" | |||||
| #include "kernel/kernel_random.h" | |||||
| CCL_NAMESPACE_BEGIN | CCL_NAMESPACE_BEGIN | ||||
| typedef ccl_addr_space struct MicrofacetExtra { | typedef ccl_addr_space struct MicrofacetExtra { | ||||
| float3 color, cspec0; | float3 color, cspec0; | ||||
| float3 fresnel_color; | float3 fresnel_color; | ||||
| float clearcoat; | float clearcoat; | ||||
| } MicrofacetExtra; | } MicrofacetExtra; | ||||
| typedef ccl_addr_space struct MicrofacetBsdf { | typedef ccl_addr_space struct MicrofacetBsdf { | ||||
| SHADER_CLOSURE_BASE; | SHADER_CLOSURE_BASE; | ||||
| float alpha_x, alpha_y, ior; | float alpha_x, alpha_y, ior; | ||||
| MicrofacetExtra *extra; | 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(KernelGlobals *kg, | ccl_device_inline void microfacet_beckmann_sample_slopes(const 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, | ||||
| float *slope_x, | float *slope_x, | ||||
| float *slope_y, | float *slope_y, | ||||
| float *G1i) | 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(KernelGlobals *kg, | ccl_device_forceinline float3 microfacet_sample_stretched(const 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, | ||||
| float *G1i) | float *G1i) | ||||
| { | { | ||||
| ▲ Show 20 Lines • Show All 142 Lines • ▼ Show 20 Lines | ccl_device int bsdf_microfacet_ggx_clearcoat_setup(MicrofacetBsdf *bsdf, const ShaderData *sd) | ||||
| bsdf->type = CLOSURE_BSDF_MICROFACET_GGX_CLEARCOAT_ID; | bsdf->type = CLOSURE_BSDF_MICROFACET_GGX_CLEARCOAT_ID; | ||||
| bsdf_microfacet_fresnel_color(sd, bsdf); | bsdf_microfacet_fresnel_color(sd, bsdf); | ||||
| return SD_BSDF | SD_BSDF_HAS_EVAL; | return SD_BSDF | SD_BSDF_HAS_EVAL; | ||||
| } | } | ||||
| ccl_device bool bsdf_microfacet_merge(const ShaderClosure *a, const ShaderClosure *b) | |||||
| { | |||||
| const MicrofacetBsdf *bsdf_a = (const MicrofacetBsdf *)a; | |||||
| const MicrofacetBsdf *bsdf_b = (const MicrofacetBsdf *)b; | |||||
| return (isequal_float3(bsdf_a->N, bsdf_b->N)) && (bsdf_a->alpha_x == bsdf_b->alpha_x) && | |||||
| (bsdf_a->alpha_y == bsdf_b->alpha_y) && (isequal_float3(bsdf_a->T, bsdf_b->T)) && | |||||
| (bsdf_a->ior == bsdf_b->ior) && | |||||
| ((bsdf_a->extra == NULL && bsdf_b->extra == NULL) || | |||||
| ((bsdf_a->extra && bsdf_b->extra) && | |||||
| (isequal_float3(bsdf_a->extra->color, bsdf_b->extra->color)) && | |||||
| (isequal_float3(bsdf_a->extra->cspec0, bsdf_b->extra->cspec0)) && | |||||
| (bsdf_a->extra->clearcoat == bsdf_b->extra->clearcoat))); | |||||
| } | |||||
| ccl_device int bsdf_microfacet_ggx_refraction_setup(MicrofacetBsdf *bsdf) | ccl_device int bsdf_microfacet_ggx_refraction_setup(MicrofacetBsdf *bsdf) | ||||
| { | { | ||||
| bsdf->extra = NULL; | bsdf->extra = NULL; | ||||
| bsdf->alpha_x = saturate(bsdf->alpha_x); | bsdf->alpha_x = saturate(bsdf->alpha_x); | ||||
| bsdf->alpha_y = bsdf->alpha_x; | bsdf->alpha_y = bsdf->alpha_x; | ||||
| bsdf->type = CLOSURE_BSDF_MICROFACET_GGX_REFRACTION_ID; | bsdf->type = CLOSURE_BSDF_MICROFACET_GGX_REFRACTION_ID; | ||||
| ▲ Show 20 Lines • Show All 175 Lines • ▼ Show 20 Lines | ccl_device float3 bsdf_microfacet_ggx_eval_transmit(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(KernelGlobals *kg, | ccl_device int bsdf_microfacet_ggx_sample(const KernelGlobals *kg, | ||||
| const ShaderClosure *sc, | 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, | ||||
| float3 *eval, | float3 *eval, | ||||
| ▲ Show 20 Lines • Show All 411 Lines • ▼ Show 20 Lines | ccl_device float3 bsdf_microfacet_beckmann_eval_transmit(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(KernelGlobals *kg, | ccl_device int bsdf_microfacet_beckmann_sample(const KernelGlobals *kg, | ||||
| const ShaderClosure *sc, | 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, | ||||
| float3 *eval, | float3 *eval, | ||||
| ▲ Show 20 Lines • Show All 172 Lines • ▼ Show 20 Lines | #endif | ||||
| } | } | ||||
| else { | else { | ||||
| label = (m_refractive) ? LABEL_TRANSMIT | LABEL_GLOSSY : LABEL_REFLECT | LABEL_GLOSSY; | label = (m_refractive) ? LABEL_TRANSMIT | LABEL_GLOSSY : LABEL_REFLECT | LABEL_GLOSSY; | ||||
| } | } | ||||
| return label; | return label; | ||||
| } | } | ||||
| CCL_NAMESPACE_END | CCL_NAMESPACE_END | ||||
| #endif /* __BSDF_MICROFACET_H__ */ | |||||