Unity Shader - ShaderToy - Waves

Unity Shader - ShaderToy - Waves

参考了:【OpenGL】Shader实例分析(一)-Wave

因为觉得太漂亮了,所以复制了,改了一下
在这里插入图片描述

shader就不讲解了,反正我是乱改的。
觉得这种在fragment shader里实现的特效,真的是很难理解,除非数学到达了登峰造极的大神,可以随便搞。

shader

Shader "shadertoy/Waves_MyTest" {
	Properties
	{
		_lineThick("line tick", Range(1, 10)) = 1
		_blockNum("block num", Range(10, 50)) = 30
	}
	CGINCLUDE  
		#include "UnityCG.cginc"              
		struct vertOut {  
			float4 pos:SV_POSITION;  
			float4 srcPos : TEXCOORD;
		};
		float _lineThick;
		float _blockNum;
		vertOut vert(appdata_base v) {
			vertOut o;
			o.pos = UnityObjectToClipPos (v.vertex);
			o.srcPos = ComputeScreenPos(o.pos);
			return o;
		}
		fixed4 frag(vertOut i) : COLOR0 {
            float siny = sin(_Time.y);
            float sinx = sin(_Time.x);
            float sinz = sin(_Time.z);
            float siny01 = siny * 0.5 + 0.5;
            float sinx01 = sinx * 0.5 + 0.5;
            float sinz01 = sinz * 0.5 + 0.5;

            float divTimes = siny01 * 10 + _blockNum - 10;
            float fmodV = 1 / divTimes;

            float radius = (siny01) * 0.1 + 0.25;
 
            // xy数值范围:[0~1],左下角是(0,0)点
            // x:[0~1]是从左到右
            // y:[0~1]是从下到上
			float2 screenXY = (i.srcPos.xy/i.srcPos.w);
			float2 sxy_bk = screenXY;
            screenXY = screenXY * 2 - 1;
            screenXY.x += (cos(_Time.y) * 0.5 + 0.5) * radius;
            screenXY.y += (siny01) * radius;
            float r = fmod(screenXY.x, fmodV) * divTimes; 
            float g = fmod(screenXY.g, fmodV) * divTimes; 

            float2 v = floor(screenXY * divTimes);
            if (fmod(v.x, 2.0) == 0 || fmod(v.y, 2.0)==0)
                r = g = 0; // 偶数的行列都不显示

            float amp = 0.2;
			fixed2 wave_color2 = 0;
			float count = 10;
			screenXY.y -= 0.12 * count;
			for(float i = 0; i < count; i++)
			{
				float freq_wave = sin(screenXY.x + _Time.y + i);
				screenXY.y += freq_wave * amp + pow(0.1, i);
				float wave_width = abs(1.0 * _lineThick / (500 * screenXY.y));
				 wave_color2 += fixed2(wave_width, wave_width); // 黄线
			}
			fixed4 blockColor = fixed4(r * screenXY.x, g * screenXY.y, 0, 1);
            fixed4 combinedColor = blockColor;

			// 白线
			float fw = sin(screenXY.x + _Time.w);
			screenXY.y += fw * 0.3 + pow(0.1, 6);
			float ww = abs(1.0 * _lineThick / (100 * screenXY.y)) + (0.8 - sxy_bk.x);
			combinedColor.xyz += ww;

            combinedColor.xy += wave_color2;

			return combinedColor;
		}
	ENDCG  
	SubShader {  
		Pass {  
			CGPROGRAM  
			#pragma vertex vert  
			#pragma fragment frag  
			#pragma fragmentoption ARB_precision_hint_fastest   
			ENDCG  
		}  
	}   
	FallBack Off  
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值