I’m writing a shader but it doesn’t work correctly,
I’ve found that problem lies in this line (which is in the vertex shader):
float S = length(v.vertex.xyz-SunPos.xyz);
for some reason it has the same value for every vertex, and this appears to be the maximum value (the highest distance between any of the vertices and the sun).
I’ve tried distance() as well but I get the same result.
Here’s the entire shader:
Shader "Custom/PlanetFog"
{
Properties
{
_DayColor ("Day Color (RGBA)", Color) = (1,1,1,1)
_NightColor ("Night Color (RGBA)", Color) = (1,1,1,1)
_Dist ("FadeOut Distance", float) = 5
h ("Atmosphere Radius", float) = 1
SunPos ("Sun projected on atmosphere", Vector) = (0,0,0,0) //projectie van zon op atmosfeer
}
SubShader
{
ZWrite Off
Fog { Mode off }
Tags { "Queue" = "Transparent" }
Blend SrcAlpha OneMinusSrcAlpha
Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
half4 _DayColor;
half4 _NightColor;
float _Dist;
float h; //straal atmosfeer
float3 SunPos; //projectie van zon op atmosfeer
struct v2f
{
float4 pos : SV_POSITION;
float4 color0 : COLOR;
float4 wpos : TEXCOORD0;
float4 spos : TEXCOORD1;
float3 norm : TEXCOORD2;
};
v2f vert(appdata_base v)
{
v2f output;
output.pos = mul(UNITY_MATRIX_MVP, v.vertex);
float S = length(v.vertex.xyz-SunPos.xyz); //afstand v elke vertex tot de zon(projectie op atmosfeer)
S /= 2.0*h;
output.color0 = S*_NightColor + (1-S)*_DayColor;
output.wpos = v.vertex;
output.spos = output.pos;
output.norm = v.normal;
return output;
}
half4 frag (v2f i) : COLOR
{
float4 color1 = i.color0;
if (i.spos.z<_Dist)
color1.w *= 2*(i.spos.z/_Dist)-1;
if (color1.w<0)
color1.w=0;
else
{
float3 viewDir = normalize(ObjSpaceViewDir(i.wpos));
float alpha = dot(viewDir,i.norm)*3-0.1;
if (alpha>1) alpha=1;
color1.w*=alpha;
}
return color1;
}
ENDCG
}
}
Fallback Off
}