用Shader写一个积雪的效果

时间:2023-03-22   阅读次数:

这个Shader目前实现了积雪的颜色变化,雪的厚度和高度控制,积雪边缘的smoothstep的一个渐变过渡。

大体效果如下图,效果要好的话,模型很重要,面数当然是越高越好,但布线要优化好可以省很多面数。

shader_snow.png

积雪量的三个对比效果


顶点渲染中,加入了一张噪波图,可以控制积雪表面的起伏,注意表面需要一定的顶点数量。

shader_snow2.png

可以控制积雪的厚度和向外溢出的效果

顶点着色部分代码:

v2f vert (appdata v)
   {
       ...
      float4 uvNoisetex=tex2Dlod(_VertNoiseTex,float4(TRANSFORM_TEX(o.uvNoise.xy,_VertNoiseTex),0,0));
      if(dot(wN,_SnowDirection)>lerp(1,-1,_Snow)){
        v.vertex.xyz+=uvNoisetex.rgb* _VertOut*v.normal;
        v.vertex.y+=_VertHeight+_VertOut;
      }
      ...
    }

下面一段是片元着色部分代码:

fixed4 frag (v2f i) : SV_Target
    {
        //法线与假定的下雪方向做点积计算
        float edge=dot(N,_SnowDirection);
        if(edge>lerp(1,-1,_Snow)){
            //边缘做一个宽度的渐变
            float sm=smoothstep(0,_SnowEdgeOut,edge);  
            //积雪边缘的过渡
            fixed3 xue=lerp(col.rgb,_SnowColor.rgb,sm);
            //积雪的颜色加了个透明
            col.rgb=lerp(col.rgb,xue,_SnowAlpha);
        }
    }
其它文章