- 单层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
示意图:
双层panel边缘渐隐
将第二层像素的坐标映射到第一层panel,计算如上。
求出两层panel的最小factorpanel单边渐隐
ClipProduct操作:
WorldPos是进行了标准化操作的顶点,offset4是矩形。
clipProduct只可能返回0或1,返回1表示此像素不渐隐,返回0表示此像素渐隐。但是此像素如果应该被裁掉的话,那就应该被裁掉。
Factor<=0表示此像素应该被裁剪。
Ceil(f1)就表示如果应该被裁掉,就把它裁掉。
总结:shader里基本上不会出现判断语句,而且基本上所有的运算都在[0,1]区间,所有判断语句会被0或1数值代替(比如上边的*ceil(f1))。这就是shader的精妙之处,也是shader的难点,不好懂。