本文主要是介绍一日一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}}
}
最后的最后,放上我的参数:
这篇关于一日一Shader·点阵图【SS_6】的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!