Changeset View
Changeset View
Standalone View
Standalone View
intern/cycles/kernel/svm/svm_closure.h
| Show All 18 Lines | |||||
| /* Closure Nodes */ | /* Closure Nodes */ | ||||
| ccl_device void svm_node_glass_setup(ShaderData *sd, ShaderClosure *sc, int type, float eta, float roughness, bool refract) | ccl_device void svm_node_glass_setup(ShaderData *sd, ShaderClosure *sc, int type, float eta, float roughness, bool refract) | ||||
| { | { | ||||
| if(type == CLOSURE_BSDF_SHARP_GLASS_ID) { | if(type == CLOSURE_BSDF_SHARP_GLASS_ID) { | ||||
| if(refract) { | if(refract) { | ||||
| sc->data0 = eta; | sc->data0 = eta; | ||||
| sc->data1 = 0.0f; | sc->data1 = 0.0f; | ||||
| sc->data2 = 0.0f; | |||||
| sd->flag |= bsdf_refraction_setup(sc); | sd->flag |= bsdf_refraction_setup(sc); | ||||
| } | } | ||||
| else | else | ||||
| sd->flag |= bsdf_reflection_setup(sc); | sd->flag |= bsdf_reflection_setup(sc); | ||||
| } | } | ||||
| else if(type == CLOSURE_BSDF_MICROFACET_BECKMANN_GLASS_ID) { | else if(type == CLOSURE_BSDF_MICROFACET_BECKMANN_GLASS_ID) { | ||||
| sc->data0 = roughness; | sc->data0 = roughness; | ||||
| sc->data1 = eta; | sc->data1 = roughness; | ||||
| sc->data2 = eta; | |||||
| if(refract) | if(refract) | ||||
| sd->flag |= bsdf_microfacet_beckmann_refraction_setup(sc); | sd->flag |= bsdf_microfacet_beckmann_refraction_setup(sc); | ||||
| else | else | ||||
| sd->flag |= bsdf_microfacet_beckmann_setup(sc); | sd->flag |= bsdf_microfacet_beckmann_setup(sc); | ||||
| } | } | ||||
| else { | else { | ||||
| sc->data0 = roughness; | sc->data0 = roughness; | ||||
| sc->data1 = eta; | sc->data1 = roughness; | ||||
| sc->data2 = eta; | |||||
| if(refract) | if(refract) | ||||
| sd->flag |= bsdf_microfacet_ggx_refraction_setup(sc); | sd->flag |= bsdf_microfacet_ggx_refraction_setup(sc); | ||||
| else | else | ||||
| sd->flag |= bsdf_microfacet_ggx_setup(sc); | sd->flag |= bsdf_microfacet_ggx_setup(sc); | ||||
| } | } | ||||
| } | } | ||||
| ▲ Show 20 Lines • Show All 78 Lines • ▼ Show 20 Lines | case CLOSURE_BSDF_DIFFUSE_ID: { | ||||
| if(sc) { | if(sc) { | ||||
| sc->N = N; | sc->N = N; | ||||
| float roughness = param1; | float roughness = param1; | ||||
| if(roughness == 0.0f) { | if(roughness == 0.0f) { | ||||
| sc->data0 = 0.0f; | sc->data0 = 0.0f; | ||||
| sc->data1 = 0.0f; | sc->data1 = 0.0f; | ||||
| sc->data2 = 0.0f; | |||||
| sd->flag |= bsdf_diffuse_setup(sc); | sd->flag |= bsdf_diffuse_setup(sc); | ||||
| } | } | ||||
| else { | else { | ||||
| sc->data0 = roughness; | sc->data0 = roughness; | ||||
| sc->data1 = 0.0f; | sc->data1 = 0.0f; | ||||
| sc->data2 = 0.0f; | |||||
| sd->flag |= bsdf_oren_nayar_setup(sc); | sd->flag |= bsdf_oren_nayar_setup(sc); | ||||
| } | } | ||||
| } | } | ||||
| break; | break; | ||||
| } | } | ||||
| case CLOSURE_BSDF_TRANSLUCENT_ID: { | case CLOSURE_BSDF_TRANSLUCENT_ID: { | ||||
| ShaderClosure *sc = svm_node_closure_get_bsdf(sd, mix_weight); | ShaderClosure *sc = svm_node_closure_get_bsdf(sd, mix_weight); | ||||
| if(sc) { | if(sc) { | ||||
| sc->data0 = 0.0f; | sc->data0 = 0.0f; | ||||
| sc->data1 = 0.0f; | sc->data1 = 0.0f; | ||||
| sc->data2 = 0.0f; | |||||
| sc->N = N; | sc->N = N; | ||||
| sd->flag |= bsdf_translucent_setup(sc); | sd->flag |= bsdf_translucent_setup(sc); | ||||
| } | } | ||||
| break; | break; | ||||
| } | } | ||||
| case CLOSURE_BSDF_TRANSPARENT_ID: { | case CLOSURE_BSDF_TRANSPARENT_ID: { | ||||
| ShaderClosure *sc = svm_node_closure_get_bsdf(sd, mix_weight); | ShaderClosure *sc = svm_node_closure_get_bsdf(sd, mix_weight); | ||||
| if(sc) { | if(sc) { | ||||
| sc->data0 = 0.0f; | sc->data0 = 0.0f; | ||||
| sc->data1 = 0.0f; | sc->data1 = 0.0f; | ||||
| sc->data2 = 0.0f; | |||||
| sc->N = N; | sc->N = N; | ||||
| sd->flag |= bsdf_transparent_setup(sc); | sd->flag |= bsdf_transparent_setup(sc); | ||||
| } | } | ||||
| break; | break; | ||||
| } | } | ||||
| case CLOSURE_BSDF_REFLECTION_ID: | case CLOSURE_BSDF_REFLECTION_ID: | ||||
| case CLOSURE_BSDF_MICROFACET_GGX_ID: | case CLOSURE_BSDF_MICROFACET_GGX_ID: | ||||
| case CLOSURE_BSDF_MICROFACET_BECKMANN_ID: { | case CLOSURE_BSDF_MICROFACET_BECKMANN_ID: | ||||
| case CLOSURE_BSDF_ASHIKHMIN_SHIRLEY_ID: { | |||||
| #ifdef __CAUSTICS_TRICKS__ | #ifdef __CAUSTICS_TRICKS__ | ||||
| if(kernel_data.integrator.no_caustics && (path_flag & PATH_RAY_DIFFUSE)) | if(kernel_data.integrator.no_caustics && (path_flag & PATH_RAY_DIFFUSE)) | ||||
| break; | break; | ||||
| #endif | #endif | ||||
| ShaderClosure *sc = svm_node_closure_get_bsdf(sd, mix_weight); | ShaderClosure *sc = svm_node_closure_get_bsdf(sd, mix_weight); | ||||
| if(sc) { | if(sc) { | ||||
| sc->N = N; | sc->N = N; | ||||
| sc->data0 = param1; | sc->data0 = param1; | ||||
| sc->data1 = 0.0f; | sc->data1 = param1; | ||||
| sc->data2 = 0.0f; | |||||
| /* setup bsdf */ | /* setup bsdf */ | ||||
| if(type == CLOSURE_BSDF_REFLECTION_ID) | if(type == CLOSURE_BSDF_REFLECTION_ID) | ||||
| sd->flag |= bsdf_reflection_setup(sc); | sd->flag |= bsdf_reflection_setup(sc); | ||||
| else if(type == CLOSURE_BSDF_MICROFACET_BECKMANN_ID) | else if(type == CLOSURE_BSDF_MICROFACET_BECKMANN_ID) | ||||
| sd->flag |= bsdf_microfacet_beckmann_setup(sc); | sd->flag |= bsdf_microfacet_beckmann_setup(sc); | ||||
| else | else if(type == CLOSURE_BSDF_MICROFACET_GGX_ID) | ||||
| sd->flag |= bsdf_microfacet_ggx_setup(sc); | sd->flag |= bsdf_microfacet_ggx_setup(sc); | ||||
| else | |||||
| sd->flag |= bsdf_ashikhmin_shirley_setup(sc); | |||||
| } | } | ||||
| break; | break; | ||||
| } | } | ||||
| case CLOSURE_BSDF_REFRACTION_ID: | case CLOSURE_BSDF_REFRACTION_ID: | ||||
| case CLOSURE_BSDF_MICROFACET_GGX_REFRACTION_ID: | case CLOSURE_BSDF_MICROFACET_GGX_REFRACTION_ID: | ||||
| case CLOSURE_BSDF_MICROFACET_BECKMANN_REFRACTION_ID: { | case CLOSURE_BSDF_MICROFACET_BECKMANN_REFRACTION_ID: { | ||||
| #ifdef __CAUSTICS_TRICKS__ | #ifdef __CAUSTICS_TRICKS__ | ||||
| if(kernel_data.integrator.no_caustics && (path_flag & PATH_RAY_DIFFUSE)) | if(kernel_data.integrator.no_caustics && (path_flag & PATH_RAY_DIFFUSE)) | ||||
| break; | break; | ||||
| #endif | #endif | ||||
| ShaderClosure *sc = svm_node_closure_get_bsdf(sd, mix_weight); | ShaderClosure *sc = svm_node_closure_get_bsdf(sd, mix_weight); | ||||
| if(sc) { | if(sc) { | ||||
| sc->N = N; | sc->N = N; | ||||
| float eta = fmaxf(param2, 1e-5f); | float eta = fmaxf(param2, 1e-5f); | ||||
| eta = (sd->flag & SD_BACKFACING)? 1.0f/eta: eta; | eta = (sd->flag & SD_BACKFACING)? 1.0f/eta: eta; | ||||
| /* setup bsdf */ | /* setup bsdf */ | ||||
| if(type == CLOSURE_BSDF_REFRACTION_ID) { | if(type == CLOSURE_BSDF_REFRACTION_ID) { | ||||
| sc->data0 = eta; | sc->data0 = eta; | ||||
| sc->data1 = 0.0f; | sc->data1 = 0.0f; | ||||
| sc->data2 = 0.0f; | |||||
| sd->flag |= bsdf_refraction_setup(sc); | sd->flag |= bsdf_refraction_setup(sc); | ||||
| } | } | ||||
| else { | else { | ||||
| sc->data0 = param1; | sc->data0 = param1; | ||||
| sc->data1 = eta; | sc->data1 = param1; | ||||
| sc->data2 = eta; | |||||
| if(type == CLOSURE_BSDF_MICROFACET_BECKMANN_REFRACTION_ID) | if(type == CLOSURE_BSDF_MICROFACET_BECKMANN_REFRACTION_ID) | ||||
| sd->flag |= bsdf_microfacet_beckmann_refraction_setup(sc); | sd->flag |= bsdf_microfacet_beckmann_refraction_setup(sc); | ||||
| else | else | ||||
| sd->flag |= bsdf_microfacet_ggx_refraction_setup(sc); | sd->flag |= bsdf_microfacet_ggx_refraction_setup(sc); | ||||
| } | } | ||||
| } | } | ||||
| Show All 36 Lines | #endif | ||||
| if(sc) { | if(sc) { | ||||
| sc->N = N; | sc->N = N; | ||||
| svm_node_glass_setup(sd, sc, type, eta, roughness, true); | svm_node_glass_setup(sd, sc, type, eta, roughness, true); | ||||
| } | } | ||||
| break; | break; | ||||
| } | } | ||||
| case CLOSURE_BSDF_WARD_ID: { | case CLOSURE_BSDF_MICROFACET_BECKMANN_ANISO_ID: | ||||
| case CLOSURE_BSDF_MICROFACET_GGX_ANISO_ID: | |||||
| case CLOSURE_BSDF_ASHIKHMIN_SHIRLEY_ANISO_ID: { | |||||
| #ifdef __CAUSTICS_TRICKS__ | #ifdef __CAUSTICS_TRICKS__ | ||||
| if(kernel_data.integrator.no_caustics && (path_flag & PATH_RAY_DIFFUSE)) | if(kernel_data.integrator.no_caustics && (path_flag & PATH_RAY_DIFFUSE)) | ||||
| break; | break; | ||||
| #endif | #endif | ||||
| ShaderClosure *sc = svm_node_closure_get_bsdf(sd, mix_weight); | ShaderClosure *sc = svm_node_closure_get_bsdf(sd, mix_weight); | ||||
| if(sc) { | if(sc) { | ||||
| sc->N = N; | sc->N = N; | ||||
| Show All 15 Lines | #ifdef __ANISOTROPIC__ | ||||
| sc->data0 = roughness/(1.0f + anisotropy); | sc->data0 = roughness/(1.0f + anisotropy); | ||||
| sc->data1 = roughness*(1.0f + anisotropy); | sc->data1 = roughness*(1.0f + anisotropy); | ||||
| } | } | ||||
| else { | else { | ||||
| sc->data0 = roughness*(1.0f - anisotropy); | sc->data0 = roughness*(1.0f - anisotropy); | ||||
| sc->data1 = roughness/(1.0f - anisotropy); | sc->data1 = roughness/(1.0f - anisotropy); | ||||
| } | } | ||||
| sd->flag |= bsdf_ward_setup(sc); | sc->data2 = 0.0f; | ||||
| if (type == CLOSURE_BSDF_MICROFACET_BECKMANN_ANISO_ID) | |||||
| sd->flag |= bsdf_microfacet_beckmann_aniso_setup(sc); | |||||
| else if (type == CLOSURE_BSDF_MICROFACET_GGX_ANISO_ID) | |||||
| sd->flag |= bsdf_microfacet_ggx_aniso_setup(sc); | |||||
| else | |||||
| sd->flag |= bsdf_ashikhmin_shirley_aniso_setup(sc); | |||||
| #else | #else | ||||
| sd->flag |= bsdf_diffuse_setup(sc); | sd->flag |= bsdf_diffuse_setup(sc); | ||||
| #endif | #endif | ||||
| } | } | ||||
| break; | break; | ||||
| } | } | ||||
| case CLOSURE_BSDF_ASHIKHMIN_VELVET_ID: { | case CLOSURE_BSDF_ASHIKHMIN_VELVET_ID: { | ||||
| ShaderClosure *sc = svm_node_closure_get_bsdf(sd, mix_weight); | ShaderClosure *sc = svm_node_closure_get_bsdf(sd, mix_weight); | ||||
| if(sc) { | if(sc) { | ||||
| sc->N = N; | sc->N = N; | ||||
| /* sigma */ | /* sigma */ | ||||
| sc->data0 = clamp(param1, 0.0f, 1.0f); | sc->data0 = clamp(param1, 0.0f, 1.0f); | ||||
| sc->data1 = 0.0f; | sc->data1 = 0.0f; | ||||
| sc->data2 = 0.0f; | |||||
| sd->flag |= bsdf_ashikhmin_velvet_setup(sc); | sd->flag |= bsdf_ashikhmin_velvet_setup(sc); | ||||
| } | } | ||||
| break; | break; | ||||
| } | } | ||||
| case CLOSURE_BSDF_DIFFUSE_TOON_ID: | case CLOSURE_BSDF_DIFFUSE_TOON_ID: | ||||
| case CLOSURE_BSDF_GLOSSY_TOON_ID: { | case CLOSURE_BSDF_GLOSSY_TOON_ID: { | ||||
| ShaderClosure *sc = svm_node_closure_get_bsdf(sd, mix_weight); | ShaderClosure *sc = svm_node_closure_get_bsdf(sd, mix_weight); | ||||
| if(sc) { | if(sc) { | ||||
| /* Normal, Size and Smooth */ | /* Normal, Size and Smooth */ | ||||
| sc->N = N; | sc->N = N; | ||||
| sc->data0 = param1; | sc->data0 = param1; | ||||
| sc->data1 = param2; | sc->data1 = param2; | ||||
| sc->data2 = 0.0f; | |||||
| if (type == CLOSURE_BSDF_DIFFUSE_TOON_ID) | if (type == CLOSURE_BSDF_DIFFUSE_TOON_ID) | ||||
| sd->flag |= bsdf_diffuse_toon_setup(sc); | sd->flag |= bsdf_diffuse_toon_setup(sc); | ||||
| else | else | ||||
| sd->flag |= bsdf_glossy_toon_setup(sc); | sd->flag |= bsdf_glossy_toon_setup(sc); | ||||
| } | } | ||||
| break; | break; | ||||
| } | } | ||||
| Show All 18 Lines | case CLOSURE_BSDF_HAIR_TRANSMISSION_ID: { | ||||
| else { | else { | ||||
| ShaderClosure *sc = &sd->closure[sd->num_closure]; | ShaderClosure *sc = &sd->closure[sd->num_closure]; | ||||
| sc = svm_node_closure_get_bsdf(sd, mix_weight); | sc = svm_node_closure_get_bsdf(sd, mix_weight); | ||||
| if(sc) { | if(sc) { | ||||
| sc->N = N; | sc->N = N; | ||||
| sc->data0 = param1; | sc->data0 = param1; | ||||
| sc->data1 = param2; | sc->data1 = param2; | ||||
| sc->offset = -stack_load_float(stack, data_node.z); | sc->data2 = -stack_load_float(stack, data_node.z); | ||||
| if(!(sd->type & PRIMITIVE_ALL_CURVE)) { | if(!(sd->type & PRIMITIVE_ALL_CURVE)) { | ||||
| sc->T = normalize(sd->dPdv); | sc->T = normalize(sd->dPdv); | ||||
| sc->offset = 0.0f; | sc->data2 = 0.0f; | ||||
| } | } | ||||
| else | else | ||||
| sc->T = sd->dPdu; | sc->T = sd->dPdu; | ||||
| if(type == CLOSURE_BSDF_HAIR_REFLECTION_ID) { | if(type == CLOSURE_BSDF_HAIR_REFLECTION_ID) { | ||||
| sd->flag |= bsdf_hair_reflection_setup(sc); | sd->flag |= bsdf_hair_reflection_setup(sc); | ||||
| } | } | ||||
| else { | else { | ||||
| Show All 28 Lines | case CLOSURE_BSSRDF_GAUSSIAN_ID: { | ||||
| float texture_blur = param2; | float texture_blur = param2; | ||||
| /* create one closure per color channel */ | /* create one closure per color channel */ | ||||
| if(fabsf(weight.x) > 0.0f) { | if(fabsf(weight.x) > 0.0f) { | ||||
| sc->weight = make_float3(weight.x, 0.0f, 0.0f); | sc->weight = make_float3(weight.x, 0.0f, 0.0f); | ||||
| sc->sample_weight = sample_weight; | sc->sample_weight = sample_weight; | ||||
| sc->data0 = radius.x; | sc->data0 = radius.x; | ||||
| sc->data1 = texture_blur; | sc->data1 = texture_blur; | ||||
| sc->data2 = 0.0f; | |||||
| sc->T.x = sharpness; | sc->T.x = sharpness; | ||||
| #ifdef __OSL__ | #ifdef __OSL__ | ||||
| sc->prim = NULL; | sc->prim = NULL; | ||||
| #endif | #endif | ||||
| sc->N = N; | sc->N = N; | ||||
| sd->flag |= bssrdf_setup(sc, (ClosureType)type); | sd->flag |= bssrdf_setup(sc, (ClosureType)type); | ||||
| sd->num_closure++; | sd->num_closure++; | ||||
| sc++; | sc++; | ||||
| } | } | ||||
| if(fabsf(weight.y) > 0.0f) { | if(fabsf(weight.y) > 0.0f) { | ||||
| sc->weight = make_float3(0.0f, weight.y, 0.0f); | sc->weight = make_float3(0.0f, weight.y, 0.0f); | ||||
| sc->sample_weight = sample_weight; | sc->sample_weight = sample_weight; | ||||
| sc->data0 = radius.y; | sc->data0 = radius.y; | ||||
| sc->data1 = texture_blur; | sc->data1 = texture_blur; | ||||
| sc->data2 = 0.0f; | |||||
| sc->T.x = sharpness; | sc->T.x = sharpness; | ||||
| #ifdef __OSL__ | #ifdef __OSL__ | ||||
| sc->prim = NULL; | sc->prim = NULL; | ||||
| #endif | #endif | ||||
| sc->N = N; | sc->N = N; | ||||
| sd->flag |= bssrdf_setup(sc, (ClosureType)type); | sd->flag |= bssrdf_setup(sc, (ClosureType)type); | ||||
| sd->num_closure++; | sd->num_closure++; | ||||
| sc++; | sc++; | ||||
| } | } | ||||
| if(fabsf(weight.z) > 0.0f) { | if(fabsf(weight.z) > 0.0f) { | ||||
| sc->weight = make_float3(0.0f, 0.0f, weight.z); | sc->weight = make_float3(0.0f, 0.0f, weight.z); | ||||
| sc->sample_weight = sample_weight; | sc->sample_weight = sample_weight; | ||||
| sc->data0 = radius.z; | sc->data0 = radius.z; | ||||
| sc->data1 = texture_blur; | sc->data1 = texture_blur; | ||||
| sc->data2 = 0.0f; | |||||
| sc->T.x = sharpness; | sc->T.x = sharpness; | ||||
| #ifdef __OSL__ | #ifdef __OSL__ | ||||
| sc->prim = NULL; | sc->prim = NULL; | ||||
| #endif | #endif | ||||
| sc->N = N; | sc->N = N; | ||||
| sd->flag |= bssrdf_setup(sc, (ClosureType)type); | sd->flag |= bssrdf_setup(sc, (ClosureType)type); | ||||
| sd->num_closure++; | sd->num_closure++; | ||||
| ▲ Show 20 Lines • Show All 184 Lines • Show Last 20 Lines | |||||