mirror of
https://github.com/drewcassidy/KSP-Conformal-Decals.git
synced 2024-09-01 18:23:54 +00:00
102 lines
2.9 KiB
HLSL
102 lines
2.9 KiB
HLSL
#ifndef LIGHTING_KSP_INCLUDED
|
|
#define LIGHTING_KSP_INCLUDED
|
|
|
|
inline fixed4 LightingBlinnPhongSmooth(SurfaceOutput s, fixed3 lightDir, half3 viewDir, fixed atten)
|
|
{
|
|
s.Normal = normalize(s.Normal);
|
|
half3 h = normalize(lightDir + viewDir);
|
|
|
|
fixed diff = max(0, dot(s.Normal, lightDir));
|
|
|
|
float nh = max(0, dot(s.Normal, h));
|
|
float spec = pow(nh, s.Specular*128.0) * s.Gloss;
|
|
|
|
fixed4 c;
|
|
c.rgb = (s.Albedo * _LightColor0.rgb * diff + _LightColor0.rgb * _SpecColor.rgb * spec) * (atten);
|
|
c.a = s.Alpha + _LightColor0.a * _SpecColor.a * spec * atten;
|
|
return c;
|
|
}
|
|
|
|
|
|
|
|
|
|
inline half4 LightingUnlit(SurfaceOutput s, half3 lightDir, half atten)
|
|
{
|
|
// half diff = max (0, dot (s.Normal, lightDir));
|
|
|
|
half4 c;
|
|
c.rgb = s.Albedo;
|
|
c.a = s.Alpha;
|
|
return c;
|
|
}
|
|
|
|
|
|
|
|
|
|
inline half4 LightingUnlit_PrePass(SurfaceOutput s, half4 light)
|
|
{
|
|
half4 c;
|
|
c.rgb = s.Albedo;
|
|
c.a = s.Alpha;
|
|
return c;
|
|
}
|
|
|
|
|
|
|
|
|
|
fixed4 LightingNoLighting(SurfaceOutput s, fixed3 lightDir, fixed atten) { return fixed4(0, 0, 0, 0); }
|
|
|
|
|
|
|
|
|
|
|
|
float4 _Color;
|
|
half _LightBoost;
|
|
half4 LightingLightWrapped(SurfaceOutput s, half3 lightDir, half3 viewDir, half atten) {
|
|
float3 w = _Color.rgb*0.5;
|
|
half3 NdotL = dot(s.Normal, lightDir);
|
|
|
|
//Specular term
|
|
half3 h = normalize(lightDir + viewDir);
|
|
s.Normal = normalize(s.Normal);
|
|
float NdotH = dot(s.Normal, h);
|
|
float spec = pow(max(NdotH, 0), s.Specular * 128.0) * s.Gloss;
|
|
fixed3 specColor = _SpecColor.rgb * _LightColor0.rgb;
|
|
|
|
half3 diff = NdotL * (1 - w) + w;
|
|
half4 c;
|
|
c.rgb = ((s.Albedo * _LightColor0.rgb * diff) + (specColor * spec)) * (atten * _LightBoost);
|
|
c.a = s.Alpha + (_LightColor0.a * _SpecColor.a * spec * atten);
|
|
return c;
|
|
}
|
|
|
|
|
|
|
|
float4 _LocalCameraPos;
|
|
float4 _LocalCameraDir;
|
|
float4 _UnderwaterFogColor;
|
|
float _UnderwaterMinAlphaFogDistance;
|
|
float _UnderwaterMaxAlbedoFog;
|
|
float _UnderwaterMaxAlphaFog;
|
|
float _UnderwaterAlbedoDistanceScalar;
|
|
float _UnderwaterAlphaDistanceScalar;
|
|
float _UnderwaterFogFactor;
|
|
|
|
float4 UnderwaterFog(float3 worldPos, float3 color)
|
|
{
|
|
float3 toPixel = worldPos - _LocalCameraPos.xyz;
|
|
float toPixelLength = length(toPixel); ///< Comment out the math--looks better without it.
|
|
//float angleDot = dot(_LocalCameraDir.xyz, toPixel / toPixelLength);
|
|
//angleDot = lerp(0.00000001, angleDot, saturate(sign(angleDot)));
|
|
//float waterDist = -_LocalCameraPos.w / angleDot;
|
|
//float dist = min(toPixelLength, waterDist);
|
|
|
|
|
|
float underwaterDetection = _UnderwaterFogFactor * _LocalCameraDir.w; ///< sign(1 - sign(_LocalCameraPos.w));
|
|
float albedoLerpValue = underwaterDetection * (_UnderwaterMaxAlbedoFog * saturate(toPixelLength * _UnderwaterAlbedoDistanceScalar));
|
|
float alphaFactor = 1 - underwaterDetection * (_UnderwaterMaxAlphaFog * saturate((toPixelLength - _UnderwaterMinAlphaFogDistance) * _UnderwaterAlphaDistanceScalar));
|
|
|
|
return float4(lerp(color, _UnderwaterFogColor.rgb, albedoLerpValue), alphaFactor);
|
|
}
|
|
|
|
#endif |