简单卡通水

参考
https://roystan.net/articles/toon-water/
源码
https://github.com/IronWarrior/ToonWaterShader

两张噪声图请添加图片描述
请添加图片描述
挂在相机上,开启深度模式,使shader可以拿到深度图

using UnityEngine;public class ChangeCameraDepth : MonoBehaviour
{public DepthTextureMode textureMode;private void OnValidate(){GetComponent<Camera>().depthTextureMode = textureMode;}private void Awake(){GetComponent<Camera>().depthTextureMode = textureMode;}}

水面shader

Shader "Custom/Water"
{Properties{_ShallowColor ("_ShallowColor", Color) = (0.4,0.9,1,1)_DeepColor ("_DeepColor", Color) = (0,0.2,0.7,1)_FoamColor("_FoamColr",COLOR) = (1,1,1,1)//这里用黑白噪声_NoiseTex ("_NoiseTex", 2D) = "white" {}//用彩色噪声表示扭曲_DistortionTex("_DistortionTex",2D) = "white"{}_FoamMinDistance("FoamMinDistance",float) = 0.02_FoamMaxDistance("_FoamMaxDistance",float) = 0.05_SurferNoiseCutoff("_SurferNoiseCutoff",Range(0,1)) = 0.7_foamSpeed("_foamSpeed",vector) = (0.3,0.3,0,0)}SubShader{Tags { "Queue" = "Transparent" }pass{Blend SrcAlpha OneMinusSrcAlphaZWrite OffCGPROGRAM#pragma vertex vert#pragma fragment frag#include "UnityCG.cginc"float4 _ShallowColor;float4 _DeepColor;float4 _FoamColor;float _FoamMinDistance;float _FoamMaxDistance;float _SurferNoiseCutoff;//水波移动速度,只用xy两个参数float2 _foamSpeed;sampler2D _CameraDepthTexture;sampler2D _CameraNormalsTexture;sampler2D _NoiseTex;sampler2D _DistortionTex;float4 _NoiseTex_ST;float4 _DistortionTex_ST;struct appdata{float4 vertex:POSITION;float2 uv:TEXCOORD0;float3 normal:NORMAL;};struct v2f{float4 pos:SV_POSITION;float4 screenPos:TEXCOORD0;float2 noiseUV:TEXCOORD1;float2 distortionUV:TEXCOORD2;float3 viewNormal:NORMAL;};v2f vert(appdata v){v2f o;o.pos = UnityObjectToClipPos(v.vertex);//齐次坐标下的屏幕坐标值o.screenPos = ComputeScreenPos(o.pos);o.viewNormal = COMPUTE_VIEW_NORMAL;o.noiseUV = TRANSFORM_TEX(v.uv,_NoiseTex);o.distortionUV = TRANSFORM_TEX(v.uv,_DistortionTex);return o;}float4 frag(v2f i):SV_TARGET0{float4 depth = tex2Dproj(_CameraDepthTexture,UNITY_PROJ_COORD( i.screenPos));//等价于//depth = tex2D(_CameraDepthTexture,i.screenPos.xy/i.screenPos.w);float depthliner = LinearEyeDepth( depth.x);//i.screenPos.zw= i.pos.zw,所以这里还可以替换成i.pos.w ,pos.w就是裁剪空间里与相机的距离(大概是,之后去确认下)float depthDiff = depthliner-i.screenPos.w;//这步非常重要,不然把视角拉平之后会出现颜色堆积渐变,也就是远处颜色深近处颜色浅,此外,在linner色彩空间下明显,在gamma空间下不明显,不太明白为啥float waterDepthDifference = saturate(depthDiff/1);float3 existingNormal = tex2Dproj(_CameraNormalsTexture,UNITY_PROJ_COORD(i.screenPos));//相当于拿到屏幕坐标和view坐标下法线的夹角,以此判断物体边缘float normalDot = saturate(dot(existingNormal,i.viewNormal));float normalDistance = lerp(_FoamMinDistance,_FoamMaxDistance,normalDot);float foamDepthDiff = saturate(depthDiff/normalDistance) *_SurferNoiseCutoff;//水的小扭曲水花float4 distortionSample = tex2D(_DistortionTex,i.distortionUV);float2 noiseUV = i.noiseUV;noiseUV =float2(noiseUV.x+ _Time.y*_foamSpeed.x+distortionSample.r,noiseUV.y+_Time.y*_foamSpeed.y+distortionSample.g);float surferNoiseSample = tex2D(_NoiseTex,noiseUV).r;float4 waterColor = lerp(_ShallowColor,_DeepColor,waterDepthDifference);float4 foamColor = _FoamColor;foamColor.a = smoothstep( foamDepthDiff-0.1,foamDepthDiff+0.1,surferNoiseSample);float4 res = lerp(waterColor,foamColor,foamColor.a);//调下透明度,让水底物体可见,而不是深度图的颜色res.a = 0.7;return res;}ENDCG}}}

核心就两点,一是对_CameraDepthTexture进行采样,获得水深水浅效果,同时获得物体水下的效果
二是对_CameraNormalsTexture进行采样拿到屏幕深度图,再和水面的view空间下的法线进行点乘,可以获得物体与水面相交的泡沫
SmoothStep用来生成:指定范围内0到1的平滑过渡值smoothstep(a,b,x) x取a-b之间

简化其中的步骤,使
foamColor.a = saturate((0.1-foamDepthDiff)/0.2);
return(0,0,0,0.7-foamDepthDiff);
可以单输出泡沫

shader想弄明白,就一条一条去把每行代码修改的结果输出出来看看,这个折腾了很长时间就是因为数值太小,输出在r通道上看不出来,弄到a通道上就清楚了

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/1380318.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

编写简单的动画

UIImageView提供了实现简单动画的功能。比如要实现这样的功能&#xff1a; 跳动的火焰。基本思路是&#xff0c;一个数组&#xff0c;包含火焰跳动所需的多张图片。然后设置播放时间&#xff0c;并开始播放。UIImageView已经提供了这方面的机制&#xff0c;只需把图片数组交给它…

干货!学会这些动漫绘画素材,小白也能学会动漫绘画,简单易学!

百头练习 只画头部,着重对五官进行精细刻画。 女性头像练习 1 定出五官的位置,注意不管是什么角度,人的眼睛、嘴巴都是和鼻子呈90的。 2 画出五官。 3 注意线条有实有虚,把五官细化描绘出来,然后大致勾勒出头发的走向。 4 画出头发丝和眼珠。 5 添加光影,使头发…

制作简单的动画

1、使用jQuery&#xff08;annimate&#xff09;制作 a、首先要做简单的页面布局&#xff08;两个div加上10幅图&#xff09; <div id"img2"><input type "button" value"上一页" id"a" ></input><input type…

使用埋点方式对应用监控

在指标监控的世界里&#xff0c;应用和业务层面的监控有两种典型手段&#xff0c;一种是在应用程序里埋点&#xff0c;另一种是分析日志&#xff0c;从日志中提取指标。埋点的方式性能更好&#xff0c;也更灵活&#xff0c;只是对应用程序有一定侵入性&#xff0c;而分析日志的…

PHP傻瓜也能搭建自己框架

PHP最简单自定义自己的框架&#xff08;一&#xff09; PHP最简单自定义自己的框架创建目录结构&#xff08;二&#xff09; PHP最简单自定义自己的框架定义常量自动生成目录&#xff08;三&#xff09; PHP最简单自定义自己的框架控制器自动加载运行&#xff08;四&#xf…

日期计算器输入天数计算日期_计算日期范围内的活动

日期计算器输入天数计算日期 Todays challenge is to count how many guests stayed at a hotel, in a specific date range, based on the guest arrival and departure dates. 今天的挑战是&#xff0c;根据客人的到达和离开日期&#xff0c;计算在特定日期范围内在酒店住宿…

【nacos】Param ‘serviceName‘ is illegal, serviceName is blank

报错信息 解决方式 一&#xff1a;缺少依赖 SpringBoot2.4之后不会默认加载bootstrap.yaml&#xff1b;需要手动在pom中加入如下依赖&#xff1a; <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-boot…

PHP利用PCRE回溯次数限制绕过某些安全限制实战案例

目录 一、正则表达式概述 有限状态自动机 匹配输入的过程分别是&#xff1a; DFA&#xff08;确定性有限状态自动机&#xff09; NFA&#xff08;非确定性有限状态自动机&#xff09; 二、回溯的过程 三、 PHP 的 pcre.backtrack_limit 限制利用 例题一 回溯绕过步骤 &…

快手在线查询权重网站源码+接口

简介&#xff1a; 快手在线查询权重源码次快手权重查询优化了算法&#xff0c;修复很多之前抖音遇到的算法上的bug&#xff0c;不再有随机数&#xff0c;每一项都是根据实际情况固定输出&#xff08;包括评分&#xff0c;发作品时间等等&#xff09; 新增用户访问ip&#xff0…

抖音皮皮虾快手无水印解析软件

介绍&#xff1a; 有一张图是获取快手cookies的方法&#xff0c;就从&#xff1a;https://live.kuaishou.com/ 登录后取出&#xff0c;随便点个链接都有啦。 网盘下载地址&#xff1a; https://zijiewangpan.com/qfNsBxGVNEs 图片&#xff1a;

集合数据类型

非数字型 列表[]&#xff08;其他语言叫数组&#xff09; 注意点&#xff1a;第一个成员的索引编号为0&#xff0c;不能访问不存在的索引编号 # list是列表变量名&#xff0c;列表中有三个成员 list[刘备,曹操,关羽] print(list[0]) print(list[1]) print(list[2]) print(li…

粘福卡多次扫,绝对真实!!!

转载于:https://www.cnblogs.com/angusbao/p/10336782.html

集五福编程c语言,支付宝如何快速集齐5张福卡 支付宝2020集五福攻略技巧

1月13日&#xff0c;支付宝2020集五福活动正式开始&#xff0c;活动一直持续到1月24日&#xff0c;也就是除夕夜。今年支付宝集五福活动延续了往年的玩法&#xff0c;包括AR扫福字、蚂蚁森林浇水得福字等。在此基础上&#xff0c;今年支付宝带来了全新的全家福卡。所有集福卡的…

支付宝福卡破解——居中的ViewPager

支付宝福卡功能刚出来&#xff0c;我就对支付宝福卡的UI实现很感兴趣。第一是因为福卡的UI比较新颖而且不久前做的项目跟福卡UI有些类似&#xff0c;第二也是很想知道支付宝这样的大厂会不会更优雅地实现福卡的UI。 1、使用hierarchyviewer查看发现福卡的容器是com.alipay.and…

支付宝福卡破解——咻一咻的ui怎么实现

通过春节的无节操营销&#xff0c;支付宝的咻一咻功能让许多人手酸过、心酸过&#xff08;没能中敬业福&#xff09;&#xff0c;在吐槽之余好奇的程序员总会猜想这ui怎么实现的呢&#xff1f; 在不看smali代码的情况下应该都会猜想咻一咻的ui实现是这样的&#xff1a;点击一下…

JAVA实现微博财神卡自动换卡,秒福卡

不废话先看图 QQ20180209-071517.png Untitled2.gif 接下来是步骤 1.提取你新浪微博的cookie,简单吧&#xff01;2.安装JAVA环境 简单吧&#xff0c;自己百度吧&#xff01;3.修改代码重点&#xff0c;敲黑板 一共有两个文件 Posttijiao的49行和HttpLogin的54行,都改成你的co…

TCP协议的报头格式和滑动窗口

文章目录 TCP报头格式端口号序号和确认序号确认应答&#xff08;ACK&#xff09;机制超时重传机制 首部长度窗口大小报文类型URGACKSYNPSHFINRST 滑动窗口滑动窗口的大小怎么设定怎么变化滑动窗口变化问题 TCP报头格式 端口号 两个端口号比较好理解&#xff0c;通过端口号来找…

福卡红包V3.0.1全开源解密版

简介&#xff1a; 1、优化响应速度 怎么玩这个福卡红包福卡红包V3.0.1全开源解密版&#xff1a; 1、简单说明 由于红包现在低1块钱&#xff0c;对一般的运营者来说成本不低&#xff0c;除非让商家出钱&#xff0c;所以吸粉并不划算&#xff0c;这个模块我认为适合做广告推广&a…

高压放大器如何正常使用的呢

高压放大器是一种用于将低电压信号转换成高电压信号的电子设备。它广泛应用于通信、雷达、医疗设备等领域。正确使用高压放大器对于保证设备的正常运行和延长使用寿命至关重要。下面安泰将介绍高压放大器的使用方法和注意事项&#xff0c;帮助您更好地了解如何正确使用高压放大…

3.2 Tomcat基础

1. Tomcat概述 Tomcat 服务器是一个免费的开放源代码的Web 应用服务器&#xff0c;属于轻量级应用服务器。 Tomcat版本&#xff1a;apache-tomcat-8.5.76。 2.IDEA集成Tomcat 第一步 第二步 第三步 ​ 编辑切换为居中 添加图片注释&#xff0c;不超过 140 字&#xff0…