90 lines
2.9 KiB
HLSL
90 lines
2.9 KiB
HLSL
#ifndef SUN_MOON_INCLUDED
|
|
#define SUN_MOON_INCLUDED
|
|
|
|
#include "JCommon.cginc"
|
|
|
|
void CalculateSunMoonColorTextured(
|
|
float4 localPos,
|
|
sampler2D tex, float4x4 posToUvMatrix,
|
|
fixed4 tintColor,
|
|
float size, fixed softEdge, fixed glow,
|
|
float4 direction,
|
|
out fixed4 color)
|
|
{
|
|
fixed3 sunPos = -direction;
|
|
fixed3 rayDir = localPos.xyz;
|
|
fixed3 sunPlaneOrigin = sunPos;
|
|
fixed3 sunPlaneNormal = sunPos;
|
|
|
|
fixed rayLength = dot(sunPlaneOrigin, sunPlaneNormal)/(dot(rayDir, sunPlaneNormal)+0.000001);
|
|
fixed3 intersectionPoint = rayDir*rayLength;
|
|
fixed sqrDistanceToSun = SqrDistance(intersectionPoint, sunPos);
|
|
fixed fSize = 1 - InverseLerpUnclamped(0, size*size*0.25, sqrDistanceToSun);
|
|
fixed fGlow = 1 - InverseLerpUnclamped(0, size*size*400*glow*glow, sqrDistanceToSun);
|
|
fGlow = saturate(fGlow);
|
|
|
|
fixed4 clear = fixed4(0,0,0,0);
|
|
fixed4 white = fixed4(1,1,1,1);
|
|
|
|
fixed4 glowColor = fixed4(tintColor.xyz, fGlow*fGlow*fGlow*fGlow*fGlow*fGlow*glow);
|
|
float4 uvSpacePos = mul(posToUvMatrix, localPos);
|
|
fixed4 texColor = tex2D(tex, uvSpacePos.xy - float2(0.5, 0.5));
|
|
texColor.a = lerp(0, texColor.a, SqrMagnitude(uvSpacePos.xy) <= 0.25);
|
|
float texAlpha = texColor.a;
|
|
|
|
float fSoftEdge = saturate(lerp(0, 1/(softEdge+0.0000001), fSize));
|
|
texColor = lerp(glowColor, texColor, fSoftEdge*texAlpha);
|
|
texColor.a = texAlpha*fSoftEdge;
|
|
|
|
color = texColor + glowColor*glowColor.a;
|
|
color *= tintColor;
|
|
color.a = saturate(color.a);
|
|
|
|
float dotProduct = dot(localPos.xyz, sunPos);
|
|
color = lerp(clear, color, dotProduct >= 0);
|
|
}
|
|
|
|
void CalculateSunMoonColor(
|
|
float4 localPos,
|
|
fixed4 tintColor,
|
|
float size, fixed softEdge, fixed glow,
|
|
float4 direction,
|
|
out fixed4 color)
|
|
{
|
|
fixed3 sunPos = -direction;
|
|
fixed3 rayDir = localPos.xyz;
|
|
fixed3 sunPlaneOrigin = sunPos;
|
|
fixed3 sunPlaneNormal = sunPos;
|
|
|
|
fixed rayLength = dot(sunPlaneOrigin, sunPlaneNormal)/(dot(rayDir, sunPlaneNormal)+0.000001);
|
|
fixed3 intersectionPoint = rayDir*rayLength;
|
|
fixed sqrDistanceToSun = SqrDistance(intersectionPoint, sunPos);
|
|
fixed fSize = 1 - InverseLerpUnclamped(0, size*size*0.25, sqrDistanceToSun);
|
|
fixed fGlow = 1 - InverseLerpUnclamped(0, size*size*400*glow*glow, sqrDistanceToSun);
|
|
fGlow = saturate(fGlow);
|
|
|
|
fixed4 clear = fixed4(0,0,0,0);
|
|
fixed4 white = fixed4(1,1,1,1);
|
|
|
|
fixed4 texColor = white;
|
|
fixed4 glowColor = fixed4(tintColor.xyz, fGlow*fGlow*fGlow*fGlow*fGlow*fGlow*glow);
|
|
fixed fSoftEdge = saturate(lerp(0, 1/(softEdge+0.0000001), fSize));
|
|
texColor = lerp(glowColor, texColor, fSoftEdge);
|
|
|
|
color = texColor + glowColor*glowColor.a*glowColor.a;
|
|
color *= tintColor;
|
|
color.a = saturate(color.a);
|
|
|
|
fixed dotProduct = dot(localPos.xyz, sunPos);
|
|
color = lerp(clear, color, dotProduct >= 0);
|
|
}
|
|
|
|
void CalculateSunMoonColorBaked(
|
|
float4 localPos, float4x4 rotationMatrix,
|
|
samplerCUBE sunCubemap,
|
|
out fixed4 color)
|
|
{
|
|
localPos = mul(rotationMatrix, float4(localPos.xyz,0));
|
|
color = texCUBE(sunCubemap, localPos.xyz);
|
|
}
|
|
#endif |