标签:fragment min 1.0 中间 obj code ack 区间 结果
Shader "Custom/_light_2" {
properties{
_RimColor("Rim Color", Color) = (1, 1, 1, 1)
_RimWidth("Rim Width", float) = 0.9
}
subshader{
pass{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "unitycg.cginc"
#include "lighting.cginc"
fixed4 _RimColor;
float _RimWidth;
struct v2f{
float4 pos:POSITION;
fixed4 col:COLOR;
};
v2f vert(appdata_base v)
{
v2f o;
o.pos = mul(UNITY_MATRIX_MVP,v.vertex);
float3 viewDir = normalize(ObjSpaceViewDir(v.vertex));
float dotProduct = 1 - dot(v.normal, viewDir);
o.col = smoothstep(1 - _RimWidth, 1.0, dotProduct);
o.col *= _RimColor;
return o;
}
fixed4 frag(v2f v):COLOR
{
return v.col;
}
ENDCG
}
}
fallback "diffuse"
}
从边缘往中间分析
dot(v.normal, viewDir) 得到的结果是0-> 边缘的的地方结果为0,越往中间越靠近1,角度从90->0产生变化
1-dot(v.normal, viewDir) 得到的结果就是 1->0
smoothstep(min, max, x)
值x位于min、max区间中。如果x=min,返回0;如果x=max,返回1;如果x在两者之间,按照下列公式返回数据:
?2?(x?minmax?min)+3?(x?minmax?min)
于是o.col就得到一个1-_RimWidth ->1之间的差值,也就是发光区域。
标签:fragment min 1.0 中间 obj code ack 区间 结果
原文地址:http://www.cnblogs.com/-Black/p/7473061.html