NGUI panel裁剪shader解读(一般人估计看不懂,慎点)

  1. 单层panel边缘渐隐
    ClipRange: 1/cy.z,1/cr.w,cr.x/cr.z,cr.y/cr.w
    解读:cr.x cr.y panel的中心坐标, cr.z半宽,cr.w 半高
    ClipArgs: cr.z/softness.x, cr.w/softness.y
    解读:渐隐量
    Vert shader:
    Out.worldPos=v.vertex*ClipRange.xy-ClipRang.zw
    结果是:(x-cr.x)/cy.z, (y-cr.y)/cr.w
    Frag shader:
    float f=(float2(1,1)-abs(IN.worldPos))*ClipArgs
    结果是:1. (cr.z-|x-cr.x|)/cr.z, (cr.w-|y-cr.y|)/cr.w
    最终:(cr.z-|x-cr.x|)/softness.x, (cr.w-|y-cr.y|)/softness.y

示意图:
NGUI panel裁剪shader解读(一般人估计看不懂,慎点)_第1张图片

  1. 双层panel边缘渐隐
    将第二层像素的坐标映射到第一层panel,计算如上。
    求出两层panel的最小factor

  2. panel单边渐隐
    NGUI panel裁剪shader解读(一般人估计看不懂,慎点)_第2张图片
    ClipProduct操作:
    NGUI panel裁剪shader解读(一般人估计看不懂,慎点)_第3张图片
    WorldPos是进行了标准化操作的顶点,offset4是矩形。
    clipProduct只可能返回0或1,返回1表示此像素不渐隐,返回0表示此像素渐隐。但是此像素如果应该被裁掉的话,那就应该被裁掉。
    Factor<=0表示此像素应该被裁剪。
    这里写图片描述
    Ceil(f1)就表示如果应该被裁掉,就把它裁掉。

总结:shader里基本上不会出现判断语句,而且基本上所有的运算都在[0,1]区间,所有判断语句会被0或1数值代替(比如上边的*ceil(f1))。这就是shader的精妙之处,也是shader的难点,不好懂。

你可能感兴趣的:(unity,shader)