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
关注
打赏
热门博文
- 3D Assets (Textures & Model & Animations) & Game Design Ideas & DCC Tutorials & TA
- LearnGL - 学习笔记目录
- Unity - Timeline 知识汇总
- Unity Graphics - 知识点目录 - 停止翻译,因为发现官方有中文文档了
- Graphic资料
- Unity Lightmap&LightProbe局部动态加载(亲测2020以及以上版本官方修复了)
- Unity - 踩坑日志 - 低版本线性颜色空间渲染异常的 “BUG”
- Unity Shader - PBR 渲染 SP 导出的素材
- 什么是 3A 游戏?
- Photosohp - 实现 2D MetaBall、MetaFont