ShaderToy内的源码与效果图如下:
![请添加图片描述](https://i-blog.csdnimg.cn/blog_migrate/5127ba198b4afc16405526d97c50d7c1.gif)
void mainImage( out vec4 fragColor, in vec2 fragCoord )
{
vec2 p = (2.0*fragCoord.xy-iResolution.xy)/iResolution.y;
float tau = 3.1415926535*2.0;
float a = atan(p.x,p.y);
float r = length(p)*0.75;
vec2 uv = vec2(a/tau,r);
float xCol = (uv.x - (iTime / 3.0)) * 3.0;
xCol = mod(xCol, 3.0);
vec3 horColour = vec3(0.25, 0.25, 0.25);
if (xCol < 1.0) {
horColour.r += 1.0 - xCol;
horColour.g += xCol;
}
else if (xCol < 2.0) {
xCol -= 1.0;
horColour.g += 1.0 - xCol;
horColour.b += xCol;
}
else {
xCol -= 2.0;
horColour.b += 1.0 - xCol;
horColour.r += xCol;
}
uv = (2.0 * uv) - 1.0;
float beamWidth = (0.7+0.5*cos(uv.x*10.0*tau*0.15*clamp(floor(5.0 + 10.0*cos(iTime)), 0.0, 10.0))) * abs(1.0 / (30.0 * uv.y));
vec3 horBeam = vec3(beamWidth);
fragColor = vec4((( horBeam) * horColour), 1.0);
}
下面是在Unity内的效果展示:
![请添加图片描述](https://i-blog.csdnimg.cn/blog_migrate/fb1d691cad67c1a8fcb0db43c8413a11.gif)
Shader"ShaderToy/ColorfulCircle"
{
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
{
fixed2 p = (2.0*i.uv.xy-1)/1;
fixed tau = 3.1415926535*2.0;
fixed a = atan2(p.y,p.x);
fixed r = length(p)*0.75;
fixed2 uv = fixed2(a/tau,r);
fixed xCol = (uv.x - (_Time.y / 3.0)) * 3.0;
xCol = fmod(xCol, 3.0);
fixed3 horColour = fixed3(0.25, 0.25, 0.25);
if (xCol < 1.0)
{
horColour.r += 1.0 - xCol;
horColour.g += xCol;
}
else if (xCol < 2.0)
{
xCol -= 1.0;
horColour.g += 1.0 - xCol;
horColour.b += xCol;
}
else
{
xCol -= 2.0;
horColour.b += 1.0 - xCol;
horColour.r += xCol;
}
uv = (2.0 * uv) - 1.0;
fixed beamWidth = (0.7+0.5*cos(uv.x*10.0*tau*0.15*clamp(floor(5.0 + 10.0*cos(_Time.y)), 0.0, 10.0))) * abs(1.0 / (30.0 * uv.y));
fixed3 horBeam = fixed3(beamWidth,beamWidth,beamWidth);
return fixed4((( horBeam) * horColour), 1.0);
}
ENDCG
}
}
}