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
关注
打赏
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?