码迷,mamicode.com
首页 > 其他好文 > 详细

边缘发光中的思考

时间:2017-09-04 15:04:28      阅读:144      评论:0      收藏:0      [点我收藏+]

标签: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位于minmax区间中。如果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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!