|
|
|
|
|
|
#define LTC_LUT_OFFSET (0.5 * rcp(LTC_LUT_SIZE)) |
|
|
|
|
|
|
|
// SSS parameters |
|
|
|
#define SSS_N_PROFILES 8 |
|
|
|
#define SSS_N_PROFILES 8 |
|
|
|
#define SSS_LOW_THICKNESS 0.005 // 5 mm |
|
|
|
|
|
|
|
uint _EnableSSS; // Globally toggles subsurface scattering on/off |
|
|
|
uint _TransmissionFlags; // 1 bit/profile; 0 = inf. thick, 1 = supports transmission |
|
|
|
uint _TexturingModeFlags; // 1 bit/profile; 0 = PreAndPostScatter, 1 = PostScatter |
|
|
|
|
|
|
diffuseLighting = float3(0.0, 0.0, 0.0); |
|
|
|
specularLighting = float3(0.0, 0.0, 0.0); |
|
|
|
float4 cookie = float4(1.0, 1.0, 1.0, 1.0); |
|
|
|
float shadow = 1; |
|
|
|
float shadow = GetDirectionalShadowAttenuation(lightLoopContext.shadowContext, positionWS, lightData.shadowIndex, L, posInput.unPositionSS); |
|
|
|
shadow = GetDirectionalShadowAttenuation(lightLoopContext.shadowContext, positionWS, lightData.shadowIndex, L, posInput.unPositionSS); |
|
|
|
float shadow = GetDirectionalShadowAttenuation(lightLoopContext, positionWS, lightData.shadowIndex, L, posInput.unPositionSS); |
|
|
|
shadow = GetDirectionalShadowAttenuation(lightLoopContext, positionWS, lightData.shadowIndex, L, posInput.unPositionSS); |
|
|
|
|
|
|
|
illuminance *= shadow; |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
[branch] if (bsdfData.enableTransmission) |
|
|
|
{ |
|
|
|
// Reverse the normal. |
|
|
|
illuminance = saturate(dot(-bsdfData.normalWS, L)); |
|
|
|
// Apply the cookie. Do not apply shadows. |
|
|
|
illuminance *= cookie.a; |
|
|
|
illuminance = saturate(dot(-bsdfData.normalWS, L)); |
|
|
|
shadow = (bsdfData.thickness <= SSS_LOW_THICKNESS) ? shadow : 1; |
|
|
|
illuminance *= shadow * cookie.a; |
|
|
|
// The difference between the Disney Diffuse and the Lambertian BRDF for transmittance is negligible. |
|
|
|
// The difference between the Disney Diffuse and the Lambertian BRDF for transmission is negligible. |
|
|
|
float3 backLight = (cookie.rgb * lightData.color) * (illuminance * lightData.diffuseScale * Lambert()); |
|
|
|
// TODO: multiplication by 'diffuseColor' and 'transmittance' is the same for each light. |
|
|
|
float3 transmittedLight = backLight * bsdfData.diffuseColor * bsdfData.transmittance; |
|
|
|
|
|
|
diffuseLighting = float3(0.0, 0.0, 0.0); |
|
|
|
specularLighting = float3(0.0, 0.0, 0.0); |
|
|
|
float4 cookie = float4(1.0, 1.0, 1.0, 1.0); |
|
|
|
float shadow = 1; |
|
|
|
|
|
|
|
// TODO: measure impact of having all these dynamic branch here and the gain (or not) of testing illuminace > 0 |
|
|
|
|
|
|
|
|
|
|
{ |
|
|
|
float3 offset = float3(0.0, 0.0, 0.0); // GetShadowPosOffset(nDotL, normal); |
|
|
|
#ifdef SHADOWS_USE_SHADOWCTXT |
|
|
|
float shadow = GetPunctualShadowAttenuation(lightLoopContext.shadowContext, positionWS + offset, lightData.shadowIndex, L, posInput.unPositionSS); |
|
|
|
shadow = GetPunctualShadowAttenuation(lightLoopContext.shadowContext, positionWS + offset, lightData.shadowIndex, L, posInput.unPositionSS); |
|
|
|
float shadow = GetPunctualShadowAttenuation(lightLoopContext, lightData.lightType, positionWS + offset, lightData.shadowIndex, L, posInput.unPositionSS); |
|
|
|
shadow = GetPunctualShadowAttenuation(lightLoopContext, lightData.lightType, positionWS + offset, lightData.shadowIndex, L, posInput.unPositionSS); |
|
|
|
#endif |
|
|
|
shadow = lerp(1.0, shadow, lightData.shadowDimmer); |
|
|
|
|
|
|
|
|
|
|
[branch] if (bsdfData.enableTransmission) |
|
|
|
{ |
|
|
|
// Reverse the normal. |
|
|
|
illuminance = saturate(dot(-bsdfData.normalWS, L)) * attenuation; |
|
|
|
// Apply the cookie. Do not apply shadows. |
|
|
|
illuminance *= cookie.a; |
|
|
|
illuminance = saturate(dot(-bsdfData.normalWS, L)) * attenuation; |
|
|
|
shadow = (bsdfData.thickness <= SSS_LOW_THICKNESS) ? shadow : 1; |
|
|
|
illuminance *= shadow * cookie.a; |
|
|
|
// The difference between the Disney Diffuse and the Lambertian BRDF for transmittance is negligible. |
|
|
|
// The difference between the Disney Diffuse and the Lambertian BRDF for transmission is negligible. |
|
|
|
float3 backLight = (cookie.rgb * lightData.color) * (illuminance * lightData.diffuseScale * Lambert()); |
|
|
|
// TODO: multiplication by 'diffuseColor' and 'transmittance' is the same for each light. |
|
|
|
float3 transmittedLight = backLight * bsdfData.diffuseColor * bsdfData.transmittance; |
|
|
|
|
|
|
diffuseLighting = float3(0.0, 0.0, 0.0); |
|
|
|
specularLighting = float3(0.0, 0.0, 0.0); |
|
|
|
float4 cookie = float4(1.0, 1.0, 1.0, 1.0); |
|
|
|
float shadow = 1; |
|
|
|
float shadow = GetDirectionalShadowAttenuation(lightLoopContext.shadowContext, positionWS, lightData.shadowIndex, L, posInput.unPositionSS); |
|
|
|
shadow = GetDirectionalShadowAttenuation(lightLoopContext.shadowContext, positionWS, lightData.shadowIndex, L, posInput.unPositionSS); |
|
|
|
float shadow = GetDirectionalShadowAttenuation(lightLoopContext, positionWS, lightData.shadowIndex, L, posInput.unPositionSS); |
|
|
|
shadow = GetDirectionalShadowAttenuation(lightLoopContext, positionWS, lightData.shadowIndex, L, posInput.unPositionSS); |
|
|
|
|
|
|
|
illuminance *= shadow; |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
[branch] if (bsdfData.enableTransmission) |
|
|
|
{ |
|
|
|
// Reverse the normal. |
|
|
|
illuminance = saturate(dot(-bsdfData.normalWS, L) * clipFactor); |
|
|
|
// Apply the cookie. Do not apply shadows. |
|
|
|
illuminance *= cookie.a; |
|
|
|
illuminance = saturate(dot(-bsdfData.normalWS, L) * clipFactor); |
|
|
|
shadow = (bsdfData.thickness <= SSS_LOW_THICKNESS) ? shadow : 1; |
|
|
|
illuminance *= shadow * cookie.a; |
|
|
|
// The difference between the Disney Diffuse and the Lambertian BRDF for transmittance is negligible. |
|
|
|
// The difference between the Disney Diffuse and the Lambertian BRDF for transmission is negligible. |
|
|
|
float3 backLight = (cookie.rgb * lightData.color) * (illuminance * lightData.diffuseScale * Lambert()); |
|
|
|
// TODO: multiplication by 'diffuseColor' and 'transmittance' is the same for each light. |
|
|
|
float3 transmittedLight = backLight * bsdfData.diffuseColor * bsdfData.transmittance; |
|
|
|