完整代码
Shader"ShaderToy/Cave" { Properties { } SubShader { Pass { CGPROGRAM #pragma vertex vert #pragma fragment frag #include "UnityCG.cginc" struct appdata { float4 vertex : POSITION; float2 uv : TEXCOORD0; }; struct v2f { float2 uv : TEXCOORD0; float4 vertex : SV_POSITION; float4 screenCoord : TEXCOORD1; }; v2f vert(appdata v) { v2f o; o.vertex = UnityObjectToClipPos(v.vertex); o.uv = v.uv; o.screenCoord.xy = ComputeScreenPos(o.vertex); return o; } fixed4 frag(v2f i) : SV_Target { //输入UV坐标 fixed2 p = (-1 + 2.0*i.uv)/1; //每个像素到屏幕中心的距离。 fixed a = atan2(p.x,p.y); // 修改距离的变量,可以理解为深度的mask。 fixed r = pow( pow(p.x*p.x,4.0) + pow(p.y*p.y,4.0), 1.0/8.0 ); // 动画 fixed2 uv = fixed2( 1.0/r + 0.2*_Time.y, a ); //于弦,UV的X和Y分别相乘 fixed f = cos(12.0*uv.x)*cos(6.0*uv.y); //加上颜色 fixed3 col = 0.5 + 0.5 * sin( 3.1416*f + fixed3(0.0,0.5,1.0) ); // 中间的部分暗下去。 col = col*r; return fixed4( col, 1.0 ); } ENDCG } } }
fixed2 p = (-1 + 2.0*i.uv)/1;
fixed a = atan2(p.x,p.y);
fixed r = pow( pow(p.x*p.x,4.0) + pow(p.y*p.y,4.0), 1.0/8.0 );
fixed f = cos(12.0*uv.x)*cos(6.0*uv.y);
cos(12.0*uv.x)
cos(6.0*uv.y)
fixed3 col = 0.5 + 0.5*sin( 3.1416*f + fixed3(0.0,0.5,1.0) );
最终效果: