1.shadertoy 测试
void mainImage( out vec4 fragColor, in vec2 fragCoord )
{
// Normalized pixel coordinates (from 0 to 1)
vec2 uv = fragCoord/iResolution.xy;
uv -= 0.5;
//将uv的x坐标进行放大
uv.x *= iResolution.x / iResolution.y;
float d = atan(uv.x,uv.y);
vec4 col = vec4(d);
fragColor = col;
}
2.效果图:
3.Unity shader中,使用atan2实现裁剪
如果你想得到一个在0到360度之间的角度值,你可以使用atan2函数,它接受两个参数并返回从正x轴到指定点在单位圆上的角度,以弧度为单位。这个角度是从负y轴到指定点的角度的补角
将角度转换到 0 - 360 度
Shader "Custom/ClipCir"
{
Properties
{
_MainTex ("Texture", 2D) = "white" {}
_ClipRange("ClipRange",range(0.0,360.0)) = 1.0
}
SubShader
{
Tags { "RenderType"="Opaque" }
LOD 100
Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
struct appdata
{
float4 vertex : POSITION;
float2 uv : TEXCOORD0;
};
struct v2f
{
float2 uv : TEXCOORD0;
UNITY_FOG_COORDS(1)
float4 vertex : SV_POSITION;
};
sampler2D _MainTex;
float _ClipRange;
float mod(float a, float b)
{
float remainder = a - floor(a / b) * b;
return remainder;
}
v2f vert (appdata v)
{
v2f o;
o.vertex = UnityObjectToClipPos(v.vertex);
o.uv = v.uv;
return o;
}
fixed4 frag (v2f i) : SV_Target
{
// 计算点在单位圆上的角度
float angle = atan2(i.uv.x - 0.5, i.uv.y - 0.5);
// 将弧度转换为角度
// 将角度映射到0到1的范围
float t = angle / (6.28318530718); // 2π
// 使用mod函数将值转换为0到360度之间的角度
float angle360 = mod(t * 360.0, 360.0);
if(angle360 <= _ClipRange){
discard;
}
// sample the texture
fixed4 col = tex2D(_MainTex, i.uv);
// apply fog
return col;
}
ENDCG
}
}
}
效果如下: