Color Linear Interpolation线性插值
写在前面:
本文章为个人学习笔记,方便以后自己复习,也希望能帮助到他人。
由于本人水平有限难免出现错误,还请评论区指出,多多指教。
部分图元和素材来源于网络,如有侵权请联系本人删除。
参考资料与链接会在文章末尾贴出。
=======================================================================
1.Interpolate Color
考虑如何将两种颜色混合起来:
_FirstCol ("FirstCol",Color) = (1,1,1,1) _SecondCol ("SecondCol",Color) = (1,1,1,1) _Blend ("Blend Value",Range(0,1)) = 0 float4 frag (v2f i) : SV_Target { float4 finalCol = _FirstCol + _SecondCol * _Blend; return finalCol; }
颜色已经可以变化,但是其实只有一种颜色受到了影响,我们继续修改下公式:
float4 frag (v2f i) : SV_Target { float4 finalCol = _FirstCol * (1-_Blend) + _SecondCol * _Blend; return finalCol; }
现在就可以从颜色1变换到颜色2,这个过程就叫做Linear Interpolation线性插值。在hlsl(high level shading language)中是有内置公式的:
跟我们自己写的一样效果但是更简单:
float4 frag (v2f i) : SV_Target
{
//float4 finalCol = _FirstCol * (1-_Blend) + _SecondCol * _Blend;
float4 finalCol = lerp(_FirstCol,_SecondCol,_Blend);
return finalCol;
}
2.Texture Linear Interpolation
lerp将A B两个值根据weight权重混合起来,实际上,我们采样贴图,最终得出的也是一个值,我们不妨试试将两个纹理采样结果lerp起来:
_Tex0 ("Tex0",2D) = "white"{} _Tex1 ("Tex1",2D) = "white"{} _Blend ("Blend Value",Range(0,1)) = 0 float4 frag (v2f i) : SV_Target { //float4 finalCol = _FirstCol * (1-_Blend) + _SecondCol * _Blend; float4 tex0 = tex2D(_Tex0,i.uv); float4 tex1 = tex2D(_Tex1,i.uv); float4 finalCol = lerp(tex0,tex1,_Blend); return finalCol; }
可以做出一张纹理向另一张纹理过渡的效果。
进一步想,lerp公式里面的weight是一个值,贴图采样也是一个值,那么我们可以试试用贴图采样结果做权重:
_Tex0 ("Tex0",2D) = "white"{} _Tex1 ("Tex1",2D) = "white"{} _Blend ("Blend Value",Range(0,1)) = 0 _WeightTex("WeightTex",2D) = "white"{} float4 frag (v2f i) : SV_Target { //float4 finalCol = _FirstCol * (1-_Blend) + _SecondCol * _Blend; float4 tex0 = tex2D(_Tex0,i.uv); float4 tex1 = tex2D(_Tex1,i.uv); float4 weight = tex2D(_WeightTex,i.uv); float4 finalCol = lerp(tex0,tex1,weight); return finalCol; }
我们用一张黑白图做权重,白色部分为1,黑色为0,代入lerp公式就得出了上图效果。
细想,如果我们权重贴图做得精细点,那么就是否可以控制哪些部分我要的是哪张纹理的效果呢?