一日一Shader·点阵图【SS_6】

今天准备做一个星座图,不过时间有点紧,只做了一半:

做了一堆星,但是星与星之间的连线还得花些功夫,不过这种效果还挺有趣的,就先放上来了。

制作这种图的思路就是先绘制点:

 if(pow((i.uv.x- _point.x ),2) + pow((i.uv.y- _point.y ),2) <_Size )col+=_Color;

这是来自于圆的方程,高中就学过的。

再绘制点阵:

                     fixed2 GetNormalPoses(fixed2 pos){
                           fixed _xUnit=1/_Row;                     
                           fixed _yUnit=1/_Column;    
                           return fixed2((pos.x+0.5)*_xUnit,(pos.y+0.5)*_yUnit);
                     }

这是根据x,y编号转换为UV坐标,其中加0.5是为了让点阵居中。

最后让点扭动起来,而扭动的方式有很多,还有各种参数可调,这个可以随意发挥:

                     fixed2 GetTwirlPos(fixed2 pos){
                           fixed t = _Time.y;
                           if (t > 360) {
                                  t -= 360;
                           }             
                           fixed xy=t*pos.x*pos.y;
                           fixed s = sin(xy)*_Twirl;
                           fixed c = cos(xy)*_Twirl;                           
                           return pos+fixed2(s,c);
                     }

关键代码段就这些了。

全部代码放最后:

Shader "MyShader/SS_6"
{
       Properties
       {
              _Row("Row",float)=10
              _Column("Column",float)=10        
              _Twirl("Twirl",float)=0.01
              _Size("Size",float)=0.00001
              [HDR]_Color("Color",Color)=(0,0,0,0)     
              [HDR]_BGColor("BGColor",Color)=(0,0,0,0)
       }
       SubShader
       {
              Pass
              {
                     CGPROGRAM
                     #pragma vertex vert
                     #pragma fragment frag                    
                     #include "UnityCG.cginc"
                     fixed _Column;
                     fixed _Row;   
                     fixed _Size;
                     fixed _Twirl;
                     fixed4 _Color;
                     fixed4 _BGColor;
                     struct appdata
                     {
                           float4 vertex : POSITION;
                           float2 uv : TEXCOORD0;
                     };
                     struct v2f
                     {
                           float4 vertex : SV_POSITION;
                           float2 uv : TEXCOORD0;
                           float4 worldPos   : TEXCOORD1;
                     };     
                     v2f vert (appdata v)
                     {
                           v2f o;
                           o.vertex = UnityObjectToClipPos( v.vertex);
                           o.uv = v.uv;
                           o.worldPos = mul(unity_ObjectToWorld, v.vertex);
                           return o;
                     }
                     //获取整齐的点阵
                     fixed2 GetNormalPoses(fixed2 pos){
                           fixed _xUnit=1/_Row;                     
                           fixed _yUnit=1/_Column;    
                           return fixed2((pos.x+0.5)*_xUnit,(pos.y+0.5)*_yUnit);
                     }
                     //扭动:注意这个函数要写在GetTwirlPoses前面,否则会报错
                     fixed2 GetTwirlPos(fixed2 pos){
                           fixed t = _Time.y;
                           if (t > 360) {
                                  t -= 360;
                           }             
                           fixed xy=t*pos.x*pos.y;
                           fixed s = sin(xy)*_Twirl;
                           fixed c = cos(xy)*_Twirl;                           
                           return pos+fixed2(s,c);
                     }
                     //获取扭动的点阵
                     fixed2 GetTwirlPoses(fixed2 pos){
                           fixed _xUnit=1/_Row;                     
                           fixed _yUnit=1/_Column;    
                           fixed2  temp=fixed2((pos.x+0.5)*_xUnit,(pos.y+0.5)*_yUnit);
                           return GetTwirlPos(temp);
                     }                    
                     fixed4 frag(v2f i) : SV_Target{                        
                           fixed4 col=   fixed4(0,0,0,1);
                           //生成若干点,随机分布
                           for(fixed x=0;x<_Column;x++){
                                  for(fixed y=0;y<_Row;y++){
                                         fixed2 _point=GetTwirlPoses(fixed2(x,y));
                                         if(pow((i.uv.x- _point.x ),2) + pow((i.uv.y- _point.y ),2) <_Size )
                                         {
                                                col+=_Color;
                                         }
                                  }
                           }
                           if(col.x+col.y+col.z<=0){
                                  col= _BGColor;                           
                           }
                           return col;
                     }                    
                     ENDCG
              }
       }
}

最后的最后,放上我的参数:

猜你喜欢

转载自blog.csdn.net/yzy1987523/article/details/106931247