- Home /
Shader problem: length() en distance()
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
}
Answer by Steven-1 · Jan 05, 2012 at 09:31 AM
Found the problem, length() en distance() do return the correct value, but what I didn't know was that the vertex position is in local space and not in global space.
Your answer
Follow this Question
Related Questions
Moving vertices in shaders 1 Answer
How to change the opacity of vertex in relation to a dummy position ? 0 Answers
Vertex Shader problem with _WorldSpaceCameraPos 1 Answer
Setting and storing vertex locations in a shader 0 Answers
How do I make a vertex invisible if its X value is > myFloat 2 Answers