PISCOnoob

导航

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公式就得出了上图效果。

细想,如果我们权重贴图做得精细点,那么就是否可以控制哪些部分我要的是哪张纹理的效果呢?

posted on 2022-11-01 14:06  PISCOnoob  阅读(113)  评论(0编辑  收藏  举报