Files
beyond/Assets/ThirdParty/Lux URP Essentials/Shaders/Includes/Lux URP Tree Creator Lighting.hlsl
2024-11-20 15:21:28 +01:00

106 lines
4.1 KiB
HLSL

#ifndef LIGHTWEIGHT_TREE_INCLUDED
#define LIGHTWEIGHT_TREE_INCLUDED
// Bark lighting
inline half3 LightingTreeBark (Light light, half3 albedo, half3 specular, half gloss, half squashAmount, half3 normal, half3 viewDir)
{
float3 halfDir = SafeNormalize(light.direction + viewDir);
half NoL = saturate( dot (normal, light.direction) );
float NoH = saturate( dot (normal, halfDir) );
float spec = pow (NoH, specular.r * 128.0f) * gloss;
half3 c;
half3 lighting = light.color * light.distanceAttenuation * light.shadowAttenuation * squashAmount;
// c = albedo * lighting * NoL + lighting * specular * spec;
c = (albedo + specular * spec) * NoL * lighting;
return c;
}
half4 LuxURPTreeBarkFragment (InputData inputData, half3 albedo, half3 specular,
half smoothness, half occlusion, half alpha, half squashAmount
)
{
Light mainLight = GetMainLight(inputData.shadowCoord);
//MixRealtimeAndBakedGI(mainLight, inputData.normalWS, inputData.bakedGI, half4(0, 0, 0, 0));
half3 color = albedo * inputData.bakedGI * occlusion;
color += LightingTreeBark(mainLight, albedo, specular, smoothness, 1.0h, inputData.normalWS, inputData.viewDirectionWS);
#ifdef _ADDITIONAL_LIGHTS
uint pixelLightCount = GetAdditionalLightsCount();
for (uint i = 0u; i < pixelLightCount; ++i)
{
Light light = GetAdditionalLight(i, inputData.positionWS);
color += LightingTreeBark(light, albedo, specular, smoothness, squashAmount, inputData.normalWS, inputData.viewDirectionWS);
}
#endif
#ifdef _ADDITIONAL_LIGHTS_VERTEX
color += inputData.vertexLighting * albedo;
#endif
return half4(color, alpha);
}
// Leaf lighting
inline half3 LightingTreeLeaf(Light light, half3 albedo, half3 specular, half gloss, half2 translucency, half3 translucencyColor, half squashAmount, half3 normal, half3 viewDir)
{
float3 halfDir = SafeNormalize(light.direction + viewDir);
half NoL = dot(normal, light.direction);
float NoH = saturate( dot (normal, halfDir) );
float spec = pow(NoH, specular.r * 128.0f) * gloss;
// view dependent back contribution for translucency
half backContrib = saturate(dot(viewDir, -light.direction));
// normally translucency is more like -nl, but looks better when it's view dependent
backContrib = lerp(saturate(-NoL), backContrib, translucency.y);
translucencyColor *= backContrib * translucency.x;
// wrap-around diffuse
NoL = saturate (NoL * 0.6h + 0.4h);
half3 c;
/////@TODO: what is is this multiply 2x here???
c = albedo * (translucencyColor * 2 + NoL);
// No lighting on spec?!
// c = c * light.color * light.distanceAttenuation * light.shadowAttenuation * squashAmount + spec;
half3 lighting = light.color * light.distanceAttenuation * light.shadowAttenuation * squashAmount;
c = (c + spec) * lighting;
return c;
}
half4 LuxURPTreeLeafFragmentPBR(InputData inputData, half3 albedo, half3 specular,
half smoothness, half occlusion, half alpha, half2 translucency, half3 translucencyColor, half squashAmount, half shadowStrength
)
{
Light mainLight = GetMainLight(inputData.shadowCoord);
//MixRealtimeAndBakedGI(mainLight, inputData.normalWS, inputData.bakedGI, half4(0, 0, 0, 0));
mainLight.shadowAttenuation = lerp(1.0h, mainLight.shadowAttenuation, shadowStrength * squashAmount /* fade out */);
half3 color = albedo * inputData.bakedGI * occlusion;
color += LightingTreeLeaf(mainLight, albedo, specular, smoothness, translucency, translucencyColor, 1, inputData.normalWS, inputData.viewDirectionWS);
#ifdef _ADDITIONAL_LIGHTS
uint pixelLightCount = GetAdditionalLightsCount();
for (uint i = 0u; i < pixelLightCount; ++i)
{
Light light = GetAdditionalLight(i, inputData.positionWS);
color += LightingTreeLeaf(light, albedo, specular, smoothness, translucency, translucencyColor, squashAmount, inputData.normalWS, inputData.viewDirectionWS);
}
#endif
#ifdef _ADDITIONAL_LIGHTS_VERTEX
color += inputData.vertexLighting * albedo;
#endif
return half4(color, alpha);
}
#endif