Unity Shader学习:几何函数练习

Unity Shader学习:几何函数练习
shader部分:

Shader "Unlit/FunctionTest"
{
	Properties
	{
		_MainTex ("Texture", 2D) = "white" {}
	}
	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;
				float4 vertex : SV_POSITION;
				float2 uv1:TEXCOORD2;
				float2 uv2:TEXCOORD3;
				float2 uv3:TEXCOORD4;
				float2 uv4:TEXCOORD1;
			};

			sampler2D _MainTex;
			float4 _MainTex_ST;
			float i;

			//防止uv越界,超出自身画布部分为0
			void ClampUV(float2 uv) {
				i = 1;
				if (uv.x<0 || uv.x>1 || uv.y<0 || uv.y>1)
				{
					i = 0;
				}
			}

			//画Smoothstep曲线
			float3 DrawSmoothstep(float2 uv) {
				ClampUV(uv);
				//获得曲线的y轴值
				float val = smoothstep(0.0, 1.0, uv.x);
				//当uv.y和y轴值差值过大时,返回0,否则返回1
				val = step(abs(val - uv.y), 0.01);
				return float3(val, val, val)*i;
			}

			//画圆
			float3 DrawCircle(float2 uv) {
				ClampUV(uv);
				//将uv-0.5使原来(0,0)点在(0.5,0.5)处
				//当uv向量距离离中心越远颜色越淡
				float val = clamp((1.0 - length(uv-float2(0.5,0.5))*3),0.0,1.0);
				//改变渐变曲线
				//val = pow(val, 2);
				//加速圆边缘渐变
				val = smoothstep(0.0, 0.1, val);
				return float3(val, val, val)*i;
			}

			//画花
			float3 DrawFlower(float2 uv) {
				ClampUV(uv);
				//atan2返回点(x,y)与x轴的夹角,范围(-π,π]
				//获取极坐标的θ角度
				float degree = atan2(uv.y-0.5, uv.x-0.5);
				//uv向量离中心点距离
				//获取极坐标的r=x2+y2开方
				float len = length(uv-float2(0.5,0.5));
				//根据极坐标玫瑰线:r(θ)=a*sin(kθ)
				//求得r
				float r = 0.3*abs(sin(degree*4.0));
				//画花环
				//保留r值与距离相差小于一定数值的
				//float val =smoothstep(0.05,0.0,abs(r - len));
				//画花瓣
				//保留r值小于到中心点距离的所有像素
				float val =smoothstep(r+0.05, r, len);
				return float3(val, val, val)*i;
			}

			//随机网格
			float3 RandomColorGrid(float2 uv) {
				ClampUV(uv);
				uv = uv * 10;
				//取整将画布分成10*10
				uv = floor(uv);
				//随机的数值
				float x = frac(sin(dot(uv.xy - float2(0.5, 0.5), float2(485.3548, 464.6831)))*45345.5456);
				float y = frac(sin(dot(uv.xy - float2(0.5, 0.5), float2(775.6745, 678.6755)))*67521.1567);
				float z = frac(sin(dot(uv.xy - float2(0.5, 0.5), float2(378.9575, 278.6456)))*24789.5645);
				//随机颜色
				return float3(x,y,z)*i;
			}

			v2f vert (appdata v)
			{
				v2f o;
				o.vertex = UnityObjectToClipPos(v.vertex);
				o.uv = TRANSFORM_TEX(v.uv, _MainTex);
				//分割画布
				o.uv1 = v.uv * 2 - float2(1, 0);
				o.uv2 = v.uv * 2;
				o.uv3 = v.uv * 2 - float2(1, 1);
				o.uv4 = v.uv * 2 - float2(0, 1);
				return o;
			}
			
			fixed4 frag (v2f i) : SV_Target
			{				
				float3 col = DrawSmoothstep(i.uv1)+ DrawCircle(i.uv2)+ DrawFlower(i.uv3)+ RandomColorGrid(i.uv4);
				return float4(col,1.0);
			}
			ENDCG
		}
	}
}

相关文章:

  • 2022-12-23
  • 2022-12-23
  • 2021-10-15
  • 2021-06-19
  • 2021-07-30
  • 2021-07-04
  • 2021-06-18
  • 2021-12-21
猜你喜欢
  • 2021-05-06
  • 2021-10-10
  • 2022-12-23
  • 2021-06-17
  • 2022-02-22
  • 2022-12-23
相关资源
相似解决方案