Unity Shader 杂记--那些令人窒息的算法--持续更新

屏住呼吸--小心死亡

  • 噪音获取边缘

噪音获取边缘

Unity Shader 杂记--那些令人窒息的算法--持续更新_第1张图片

如图所示,我们通过一张噪声图来实现这种溶解的效果,可以对于溶解边缘的获取,也就是图中2的区域,使用怎样的计算方式获取呢?记得一开始做这当溶解的时候,是做了两次阀值判断,假设噪声图的a为x,则当x<0.2时为图中1,当x<0.3且x>0.2时为图中2,当x>0.3时为图3,确实当时就是用if语句判断的,在大佬面前这个写法会被鄙视,所以今天分享一下两一种没有if判断的方式:

	//---假设遮罩图的a通道的值为Mask,过度控制的阀值为Transition.
	//--我们通过缩放系数控制应对噪声图的变化系数,Scale--数学意义上讲为了防止Transition*1.7-1.99*Mask越界出现负数
	//--因为一旦出现负数就意味着有部分像素将无法改变。假设scale为1,则最终取值范围为[-0.99,1.7],当Transition为0时,
	//--则mask<1/1.99的地方结果都一样,
	float firstTranTemp= (Transition*1.7-1.99*Mask)*Scale+1;
	//---这里我们假设图中2的宽度为width,则通过下面控制
	float firstRadio=clamp(firstTranTemp*width,0,1);
	//----我们假设有三种颜色需要混合,图中1区域为DiffColor,2区域的TransitionColor,3区域为SpColor
	//---此时firstTranTemp<0区域赋值SpColor,firstTranTemp*width在0-1为混合色,大于1的地方过度色
	float4 firstTransColor = lerp(SpColor, TransitionColor, firstRadio);
	//--我们设定第二个阀值,这个阀值为1.5小于1.7,这个阀值与1.7的区别在于最大上限下移0.2
	//---首先我们注意下,我们是减去mask的数值
	float secondTranTemp=(Transition*1.5-1.99*Mask)*Scale+1;
	//--与0为分界线进行划分,如果我们将为1的部分进行上
	secondTranTemp = max(0, step(0, secondTranTemp));
	//---我们将二次分界的和第一次颜色处理。此时颜色分为3个部分:
	//-----第一部分:第一次划分小于0的部分。
	//-----第二部分:第二次划分大于0的部分。
	//-----第三部分:第一次划分大于0,第二次划分小于0的部分。也就是我们的过度部分
	float4 secondTransColor  = (secondTranTemp != 0) ? spColor : firstTransColor;
	//---我们将第一部分替换为diffColor
	//-----我们将第一次限定的数值进行0划分,然后开始替换
	firstRadio = max(0, step(0, firstRadio));
	float4 endColor= lerp(DiffColor, secondTransColor, firstRadio);

有种推箱子的感觉。。。其实从图上我们看出这种算法还是可以调整的地方,比如在图中2区域过渡的顺序是反序的,我们可以通过反向算法将其修正,不过这些都是看效果了。

你可能感兴趣的:(Shader杂谈,unity3d)