中级Shader教程05 2D雪花


本篇主要技术点有:
1. grid 空间划分
2. 2D模拟3D中”分层”的概念
3. 透视模拟

1.原理:

前面中介绍了2D模拟3D中的一些小技巧,这里用到了透视以及空间划分的概念,这里将不再重复:

2.分析:

ps:后面()中的数字表示前面透视中的特点
根据 中级Shader教程02 基本图形2D中介绍了相应的一些概念
将上述知识具体到观察下雪这各场景中:
1. 雪花前面的大点(1)
2. 雪花前面的少点(2)
3. 雪花前面的亮点(3)

其他的特点有:

  1. 整体是向下降落,因为透视关系后面的下降速度慢点(2)
  2. 现实中的雪花的薄厚程度不一
  3. 雪花的空间分布比较随机
  4. 雪花的下落过程的可能会左右移动

3.代码实现:

1.空间划分

uv *=10;//将uv放大后frac
uv = frac(uv);
uv-=0.5

2.添加随机值

fixed2 Rand22(fixed2 co){
    fixed x = frac(sin(dot(co.xy ,fixed2(122.9898,783.233))) * 43758.5453);
    fixed y = frac(sin(dot(co.xy ,fixed2(457.6537,537.2793))) * 37573.5913);
    return fixed2(x,y);
}
fixed2 r = Rand22(floor(uv));
col = fixed3(r,0.0);

3.uv偏移

float2 rgrid = Rand22(floor(uv));//0~1.0
uv = frac(uv);
uv -= (rgrid*2.0-1.0) * 0.35;
uv -=0.5;

4.绘制基本图形

float r = length(uv);

float r = length(uv);
float circleSize = 0.3;
float val = smoothstep(circleSize,-circleSize,r);
float3 col = float3(val,val,val)* rgrid.x ;

5.添加不同的layer

针对不同的layer 需要调节的参数有
1.格子数量
2.y轴移动速度
3.x轴移动速度
4.格子的随机值

基本属性定义

        SIZE_RATE ("SIZE_RATE", float) = 0.1
        XSPEED ("XSPEED", float) = 0.2
        YSPEED ("YSPEED", float) = 0.5
        LAYERS ("LAYERS", float) = 10

单层绘制

        float3 SnowSingleLayer(float2 uv,float layer){
                fixed3 acc = fixed3(0.0,0.0,0.0);//让雪花的大小变化
                uv = uv * (2.0+layer);//透视视野变大效果
                float xOffset = uv.y * (((Hash11(layer)*2-1.)*0.5+1.)*XSPEED);//增加x轴移动
                float yOffset = (YSPEED*ftime);//y轴下落过程
                uv += fixed2(xOffset,yOffset);
                float2 rgrid = Hash22(floor(uv)+(31.1759*layer));
                uv = frac(uv);
                uv -= (rgrid*2-1.0) * 0.35;
                uv -=0.5;
                float r = length(uv);
                //让大小变化点
                float circleSize = 0.05*(1.0+0.3*sin(ftime*SIZE_RATE));
                float val = smoothstep(circleSize,-circleSize,r);
                float3 col = float3(val,val,val)* rgrid.x ;
                return col;
            }

        ENDCG
    }//end pass
  }//end SubShader
}//end Shader

1.多层绘制

float3 Snow(float2 uv){
    float3 acc = float3(0,0,0);
    for (fixed i=0.;i<LAYERS;i++) {
        acc += SnowSingleLayer(uv,i); 
    }
    return acc;
}

没有更多推荐了,返回首页

私密
私密原因:
请选择设置私密原因
  • 广告
  • 抄袭
  • 版权
  • 政治
  • 色情
  • 无意义
  • 其他
其他原因:
120
出错啦
系统繁忙,请稍后再试