Simple Water Caustic Pattern In Unity ShaderGpaph

news/2024/11/14 19:10:53/

shadertoy上有各种神奇的效果,以我的见识根本想象不到这些是怎么弄出来的。

不过不会做至少可以先会用。

这篇文章抓取一个shadertoy的示例以制作一个测试效果。

 参考这篇shadertoy,使用自定义节点装填hlsl的noise代码

Shader - Shadertoy BETA

 首先使用世界xz坐标作为uv,添加tiling&offset调整。

表现为这样子

 具体做法是创建hlsl文件写入计算方法,shadertoy上的写法和unity hlsl中有些区别,按位置诸葛替换掉即可。

float4 mod289(float4 x)
{return x - floor(x / 289.0) * 289.0;
}float4 permute(float4 x)
{return mod289((x * 34.0 + 1.0) * x);
}float4 snoise(float3 v)
{const float2 C = float2(1.0 / 6.0, 1.0 / 3.0);// First cornerfloat3 i  = floor(v + dot(v, C.yyy));float3 x0 = v   - i + dot(i, C.xxx);// Other cornersfloat3 g = step(x0.yzx, x0.xyz);float3 l = 1.0 - g;float3 i1 = min(g.xyz, l.zxy);float3 i2 = max(g.xyz, l.zxy);float3 x1 = x0 - i1 + C.x;float3 x2 = x0 - i2 + C.y;float3 x3 = x0 - 0.5;// Permutationsfloat4 p =permute(permute(permute(i.z + float4(0.0, i1.z, i2.z, 1.0))+ i.y + float4(0.0, i1.y, i2.y, 1.0))+ i.x + float4(0.0, i1.x, i2.x, 1.0));// Gradients: 7x7 points over a square, mapped onto an octahedron.// The ring size 17*17 = 289 is close to a multiple of 49 (49*6 = 294)float4 j = p - 49.0 * floor(p / 49.0);  // mod(p,7*7)float4 x_ = floor(j / 7.0);float4 y_ = floor(j - 7.0 * x_); float4 x = (x_ * 2.0 + 0.5) / 7.0 - 1.0;float4 y = (y_ * 2.0 + 0.5) / 7.0 - 1.0;float4 h = 1.0 - abs(x) - abs(y);float4 b0 = float4(x.xy, y.xy);float4 b1 = float4(x.zw, y.zw);float4 s0 = floor(b0) * 2.0 + 1.0;float4 s1 = floor(b1) * 2.0 + 1.0;float4 sh = -step(h, 0);float4 a0 = b0.xzyw + s0.xzyw * sh.xxyy;float4 a1 = b1.xzyw + s1.xzyw * sh.zzww;float3 g0 = float3(a0.xy, h.x);float3 g1 = float3(a0.zw, h.y);float3 g2 = float3(a1.xy, h.z);float3 g3 = float3(a1.zw, h.w);// Compute noise and gradient at Pfloat4 m = max(0.6 - float4(dot(x0, x0), dot(x1, x1), dot(x2, x2), dot(x3, x3)), 0.0);float4 m2 = m * m;float4 m3 = m2 * m;float4 m4 = m2 * m2;float3 grad =-6.0 * m3.x * x0 * dot(x0, g0) + m4.x * g0 +-6.0 * m3.y * x1 * dot(x1, g1) + m4.y * g1 +-6.0 * m3.z * x2 * dot(x2, g2) + m4.z * g2 +-6.0 * m3.w * x3 * dot(x3, g3) + m4.w * g3;float4 px = float4(dot(x0, g0), dot(x1, g1), dot(x2, g2), dot(x3, g3));return 42.0 * float4(grad.xyz, dot(m4, px));
}// Based on: https://www.shadertoy.com/view/3d3yRj
// See also: KdotJPG's https://www.shadertoy.com/view/wlc3zrvoid water_caustics_float(float3 posIn, out float noiseOut) {float4 n = snoise( posIn );posIn -= 0.07*n.xyz;posIn *= 1.62;n = snoise( posIn );posIn -= 0.07*n.xyz;n = snoise( posIn );posIn -= 0.07*n.xyz;n = snoise( posIn );noiseOut = exp(n.w*3 - 1.5f);
}

 但是注意,想要在unity的自定义节点中输出,必须要在调用方法中使用out关键字,有几个输出就添加几个out,并且方法名最后添加_float后缀,然后在自定义节点中引用此hlsl文件,设置传入值和输出值。

 直接输出到颜色上,然后抄一下网站中xz使用位置,y使用时间。

 这种效果就来了。

 再搞一搞颜色,这里用了浅蓝和灰色代表光照强和光照弱的位置


http://www.ppmy.cn/news/1268629.html

相关文章

大模型微调方法:冻结方法 Freeze、P-Tuning 系列、LoRA、QLoRA

大模型微调方法 冻结方法 FreezeP-Tuning 系列Prefix-TuningPrompt TuningP-Tuning v1P-Tuning v2 LoRAQLoRA 冻结方法 Freeze 方法意思是,只用少部分参数训练,把模型的大部分参数冻结。 只要设置微调层的参数: # 遍历模型的所有参数和名称…

【报错栏】(vue)Module not found: Error: Can‘t resolve ‘element-ui‘ in xxx

Module not found: Error: Cant resolve element-ui in xxx 报错原因是: 未安装 element-ui 依赖 解决: npm install element-ui 运行

【Linux】:线程(三)同步和消费者模型

线程的同步 一.条件变量二.生产者和消费者模型1.概念和特点2.实现基于阻塞队列的生产者消费者模型 同步:在保证数据安全的前提下,让线程能够按照某种特定的顺序访问临界资源,从而有效避免饥饿问题,叫做同步。 竞态条件&#xff1a…

JavaEE:单例模式(饿汉模式和懒汉模式)精讲

前言 什么是单例模式? 其实用通俗的话就是程序猿约定俗成的一些东西,就比如如果你继承了一个抽象类,你就要重写里面的抽象方法,如果你实现了一个接口,你就要重写里面的方法。如果不进行重写,那么编译器就会…

windows redis 允许远程访问配置

安装好windows版本的redis,会以服务方式启动,但是不能远程访问,这个时候需要修改配置。redis安装路径下会有2个配置文件,究竟需要怎么修改才能生效呢?看下图 这里的redis服务指定了是redis.windows-service.conf文件&…

RabbitMQ安装在Linux系统详细教程

安装教程: 1.首先将下载好的文件上传到服务器,拉到opt文件夹中(可以用xftp) 2.输入命令: cd /opt 3.安装erlang rpm -ivh erlang-23.3.4.11-1.el7.x86_64.rpm rpm -ivh(复制配置文件的名字) 4.在Rab…

力扣二叉树--第四十一天

前言 写完这三道题,二叉树部分就先告一段落了。其实还有很多模糊的地方。 内容 一、修剪二叉搜索树 669. 修剪二叉搜索树 给你二叉搜索树的根节点 root ,同时给定最小边界low 和最大边界 high。通过修剪二叉搜索树,使得所有节点的值在[l…

Hive命令操作

1.命令行模式 1. 获取帮助 --> hive -H 或-help 2. 运行hive语句 --> hive -e "执行语句" 3. 运行hive文件 --> hive –f "执行文件" 4. 定义变量 --> hive –hivevar keyvalue 5. 引用变量 --> ${varname} 2. 交互模式 1. 进入客户端 -…