180 lines
5.7 KiB
HLSL
180 lines
5.7 KiB
HLSL
#if !defined(SHADERGRAPH_PREVIEW) || defined(LIGHTWEIGHT_LIGHTING_INCLUDED)
|
|
|
|
// As we do not have access to the vertex lights we will make the shader always sample add lights per pixel
|
|
#if defined(_ADDITIONAL_LIGHTS_VERTEX)
|
|
#undef _ADDITIONAL_LIGHTS_VERTEX
|
|
#define _ADDITIONAL_LIGHTS
|
|
#endif
|
|
#endif
|
|
|
|
|
|
void Lighting_half(
|
|
|
|
// Base inputs
|
|
float3 positionWS,
|
|
half3 viewDirectionWS,
|
|
|
|
// Normal inputs
|
|
half3 normalWS,
|
|
half3 tangentWS,
|
|
half3 bitangentWS,
|
|
bool enableNormalMapping,
|
|
half3 normalTS,
|
|
|
|
// Surface description
|
|
half3 albedo,
|
|
half metallic,
|
|
half3 specular,
|
|
half smoothness,
|
|
half occlusion,
|
|
half alpha,
|
|
|
|
// Lighting specific inputs
|
|
half transmissionStrength,
|
|
half transmissionPower,
|
|
half transmissionDistortion,
|
|
half transmissionShadowstrength,
|
|
half transmissionMaskByShadowstrength,
|
|
|
|
// Lightmapping
|
|
float2 lightMapUV,
|
|
|
|
// Final lit color
|
|
out half3 MetaAlbedo,
|
|
out half3 FinalLighting,
|
|
out half3 MetaSpecular
|
|
)
|
|
{
|
|
|
|
//#ifdef SHADERGRAPH_PREVIEW
|
|
#if defined(SHADERGRAPH_PREVIEW) || ( !defined(LIGHTWEIGHT_LIGHTING_INCLUDED) && !defined(UNIVERSAL_LIGHTING_INCLUDED) )
|
|
FinalLighting = albedo;
|
|
MetaAlbedo = half3(0,0,0);
|
|
MetaSpecular = half3(0,0,0);
|
|
#else
|
|
|
|
|
|
// Real Lighting ----------
|
|
|
|
if (enableNormalMapping) {
|
|
normalWS = TransformTangentToWorld(normalTS, half3x3(tangentWS.xyz, bitangentWS.xyz, normalWS.xyz));
|
|
}
|
|
normalWS = NormalizeNormalPerPixel(normalWS);
|
|
viewDirectionWS = SafeNormalize(viewDirectionWS);
|
|
|
|
// GI Lighting
|
|
half3 bakedGI;
|
|
#ifdef LIGHTMAP_ON
|
|
lightMapUV = lightMapUV * unity_LightmapST.xy + unity_LightmapST.zw;
|
|
bakedGI = SAMPLE_GI(lightMapUV, half3(0,0,0), normalWS);
|
|
#else
|
|
bakedGI = SampleSH(normalWS);
|
|
#endif
|
|
|
|
BRDFData brdfData;
|
|
InitializeBRDFData(albedo, metallic, specular, smoothness, alpha, brdfData);
|
|
|
|
FinalLighting = GlobalIllumination(brdfData, bakedGI, occlusion, normalWS, viewDirectionWS);
|
|
|
|
// Get Shadow Sampling Coords / Unfortunately per pixel...
|
|
#if SHADOWS_SCREEN
|
|
float4 clipPos = TransformWorldToHClip(positionWS);
|
|
float4 shadowCoord = ComputeScreenPos(clipPos);
|
|
#else
|
|
float4 shadowCoord = TransformWorldToShadowCoord(positionWS);
|
|
#endif
|
|
|
|
Light mainLight = GetMainLight(shadowCoord);
|
|
MixRealtimeAndBakedGI(mainLight, normalWS, bakedGI, half4(0, 0, 0, 0));
|
|
|
|
// Main Light
|
|
FinalLighting += LightingPhysicallyBased(brdfData, mainLight, normalWS, viewDirectionWS);
|
|
// translucency
|
|
half3 transLightDir = mainLight.direction + normalWS * transmissionDistortion;
|
|
half transDot = dot( transLightDir, -viewDirectionWS );
|
|
transDot = exp2(saturate(transDot) * transmissionPower - transmissionPower);
|
|
half NdotL = saturate(dot(normalWS, mainLight.direction));
|
|
FinalLighting += brdfData.diffuse * transDot * (1.0 - NdotL) * mainLight.color * lerp(1.0h, mainLight.shadowAttenuation, transmissionShadowstrength) * transmissionStrength * 4;
|
|
|
|
// Handle additional lights
|
|
#ifdef _ADDITIONAL_LIGHTS
|
|
uint pixelLightCount = GetAdditionalLightsCount();
|
|
for (uint i = 0u; i < pixelLightCount; ++i) {
|
|
//Light light = GetAdditionalLight(i, positionWS);
|
|
// Get index upfront as we need it for GetAdditionalLightShadowParams();
|
|
int index = GetPerObjectLightIndex(i);
|
|
Light light = GetAdditionalPerObjectLight(index, positionWS);
|
|
FinalLighting += LightingPhysicallyBased(brdfData, light, normalWS, viewDirectionWS);
|
|
|
|
half4 shadowParams = GetAdditionalLightShadowParams(index);
|
|
light.color *= lerp(1, shadowParams.x, transmissionMaskByShadowstrength); // shadowParams.x == shadow strength, which is 0 for point lights
|
|
|
|
// translucency
|
|
transLightDir = light.direction + normalWS * transmissionDistortion;
|
|
transDot = dot( transLightDir, -viewDirectionWS );
|
|
transDot = exp2(saturate(transDot) * transmissionPower - transmissionPower);
|
|
NdotL = saturate(dot(normalWS, light.direction));
|
|
FinalLighting += brdfData.diffuse * transDot * (1.0 - NdotL) * light.color * lerp(1.0h, light.shadowAttenuation, transmissionShadowstrength) * light.distanceAttenuation * transmissionStrength * 4;
|
|
}
|
|
#endif
|
|
|
|
// Set Albedo for meta pass
|
|
#if defined(LIGHTWEIGHT_META_PASS_INCLUDED) || defined(UNIVERSAL_META_PASS_INCLUDED)
|
|
FinalLighting = half3(0,0,0);
|
|
MetaAlbedo = albedo;
|
|
MetaSpecular = specular;
|
|
#else
|
|
MetaAlbedo = half3(0,0,0);
|
|
MetaSpecular = half3(0,0,0);
|
|
#endif
|
|
|
|
// End Real Lighting ----------
|
|
|
|
#endif
|
|
}
|
|
|
|
// Unity 2019.1. needs a float version
|
|
|
|
void Lighting_float(
|
|
|
|
// Base inputs
|
|
float3 positionWS,
|
|
half3 viewDirectionWS,
|
|
|
|
// Normal inputs
|
|
half3 normalWS,
|
|
half3 tangentWS,
|
|
half3 bitangentWS,
|
|
bool enableNormalMapping,
|
|
half3 normalTS,
|
|
|
|
// Surface description
|
|
half3 albedo,
|
|
half metallic,
|
|
half3 specular,
|
|
half smoothness,
|
|
half occlusion,
|
|
half alpha,
|
|
|
|
// Lighting specific inputs
|
|
half transmissionStrength,
|
|
half transmissionPower,
|
|
half transmissionDistortion,
|
|
half transmissionShadowstrength,
|
|
half transmissionMaskByShadowstrength,
|
|
|
|
// Lightmapping
|
|
float2 lightMapUV,
|
|
|
|
// Final lit color
|
|
out half3 MetaAlbedo,
|
|
out half3 FinalLighting,
|
|
out half3 MetaSpecular
|
|
)
|
|
{
|
|
Lighting_half(
|
|
positionWS, viewDirectionWS, normalWS, tangentWS, bitangentWS, enableNormalMapping, normalTS,
|
|
albedo, metallic, specular, smoothness, occlusion, alpha,
|
|
transmissionStrength, transmissionPower, transmissionDistortion, transmissionShadowstrength, transmissionMaskByShadowstrength,
|
|
lightMapUV, MetaAlbedo, FinalLighting, MetaSpecular);
|
|
} |