今天准备做一个星座图,不过时间有点紧,只做了一半:
做了一堆星,但是星与星之间的连线还得花些功夫,不过这种效果还挺有趣的,就先放上来了。
制作这种图的思路就是先绘制点:
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
}
}
}
最后的最后,放上我的参数: