Unity学习shader笔记[一百零八]简单萤火效果
之前用粒子系统基于原有萤火虫的粒子改了一波慢萤火效果就被惊艳到了,开始大家讨论,就都觉得这样大数量的粒子消耗挺大的,后面测试过才发现单纯的粒子系统在总粒子数量3000,每秒300的生成数量,屏幕呈现有1000多个粒子的时候, 在华为P30也能稳定维持FPS在60帧左右。可能unity后面做了优化。
思路
首先要确定的是在范围内绘制出流动和显隐, 这个功能是很多其他功能的基础,例如雪花,落叶,落花,战火,面片雾,下雨等,扩展效果一般是添加一些随机翻转,缩放,增加顶点,初始顶点的随机偏移, 替换贴图等。 应用范围比较广。 因为是基于GPU做的效果,性能上得到了保证。
尝试思路
c#能传入一个世界坐标,或者在shader里面找到模型内某个点的坐标,shader中深度图转换坐标后对应上这个位置的将其绘制出来。后来觉得这个思路不太正确。
因为深度转只能在给定的深度转出世界坐标,当某些部分的深度本身代表的区域不在cube内部的时候,转出的世界坐标也不在cube内部,传入的世界坐标都是在cube内部,那么这个区域就成了一个deadzone, 任何点都不会在这里出现。 点在运动图中因为从非deadzone走入deadzone而导致相应位置转不出相应坐标而出现的闪烁问题。这样只能在cube范围比较大的时候使用,deadzone与非deadzone夹杂,非deadzone足够多 ,表现才可能不太违和。
基于点去在shader中绘制一定范围的以该点为圆心的圆形区域,再以此采样贴图去表现,也是实现起来坑比较多的。主要是采样贴图这个部分,圆形区域内的所有uv不能确保全部计算正确,采样贴图注定做不很好,表现效果就不太正常。
就算上面的问题解决了,屏幕大范围的深度图采样和重建世界坐标消耗是比较大的,移动端会比较影响性能,严重一些就是移动端会因此砍掉这个。
所以这个方向做了一部分就停止了
最后思路
还是采用中规中矩的C#生成mesh,shader进行运动和细致表现的方法,能够轻松表现萤火与普通物体的互相遮挡的关系和空间感。 在c#中给出同一位置的四个顶点,分配完整的uv,在shader中连成由两个三角形组成的矩形,最后将所有的三角形组合成一个mesh。耗时的工作在GPU中做。
正方形面片的生成
在shader中根据顶点对应的UV,将顶点局部坐标位置以自身运动坐标为基础, 摄像机up轴和right轴为方向的扩展。
随机运动
使用柏林噪声函数,初始的模型坐标乘以时间变量和速度变化量,然后随机选取两个分量生成噪声,噪声用于位置偏移xyz,偏移可以乘以一个放大值表示路径的扩大程度。最后顶点原始位置加上这个偏移量,因为柏林噪声只要输入值是连续的,结果值就是连续的。输入是time的变种,总体来说是连续的,结果值就不会出现突变导致位置突变。
边界显隐
判断世界坐标xyz是否到了边界,取xyz分量离世界坐标边界的最小值,到了阈值范围就进行透明度变化
边界控制
运动后的粒子如果某个维度超过了边界值,就该维度对边界值取余,取余结果加上反向边界重新赋值给该维度。表现上就是在左边界飘出去的萤火,会在右边界飘进来。这里的边界限制做不到,碰撞到边界之后反弹。粒子是由其自身的初始局部坐标加时间变量生成随机数得到运动总路程 这是在shader中做的,。这意味着只能控制总路程的情况下,这就意味着在碰撞到边界之后,需要更改当前的运动方向,是不现实的,只能够是大改,得到随机运动速度,但是叠加路程不能在shader里面做,因为shader不会像对象一样保存成员变量,除非在C#或者CompueShader中做,C#不能够同时计算这么多的粒子,所以只能后者,ComputeShader记得可以计算后保存变量, 但是目前我的认知中,它不能直接和shader进行交互,所以可能也不能实现。
问题
距离和速度的计算分离
每个面片的运动是独立的,那么思路在shader是每个面片根据自身初始的局部坐标位置来与时间做运算,得到不同的实时随机噪声,用这个噪声来扩大一定的倍数代表xyz方向上的运动路径。c#中不能得到每个面片的路径。统一传入到shader中的也是类似于time的一个变量。 干脆就用time变量了。
太久没写shader了,距离和速度的计算分离开始时候没有想清楚
perlin_noise
这个函数类似于用输入变量作为uv去采样柏林噪声图。
因此输入变量的变化快慢决定了结果值的变化快慢。
所以当显隐速度过快的时候,可以在输入哪里乘以小数减小变化量。
透明度
Blend One One 本身是当前颜色和缓冲区颜色直接叠加的方式进行变亮的。在不进行透明度调节的时候,可以表现出萤火的高光。但是在透明度调节的时候,其本身的含义就决定了透明度不会影响到表现效果。即不会有隐现效果。
位置的计算
M矩阵转换的时候,注意四维向量右乘四维矩阵,M的第四列前三行代表的是物体在世界坐标系的位移。如果用三维向量去乘,那么unity会自动补齐第四位为0,得到的结果将会是忽略了位移的模型空间到世界空间的变换,所以和M矩阵计算的时候,模型坐标系位置向量的第四位应该是1。
缩放的影响
边界值是世界单位的,顶点在模型坐标系中进行了位移计算后,转到裁剪空间的过程中,M矩阵包含了物体的缩放。
位移后的顶点会以相同的缩放进行放大,原来的边界就不足以囊括所有的顶点了。所以边界值要做对应维度的缩放。举个例子x方向最大维度是f,则x方向最大的边距是x+f,在x方向是1倍的时候,能包住所有粒子。 但是x方向扩大了三倍,为了保证x方向的边距能够包含所有的粒子,x方向最大的边距是x+3f。
工程链接
Unity 非后处理简单萤火效果
过程中有一些中间版本有点有趣,备份了一下。
Unity学习shader笔记[一百零八]简单萤火效果相关推荐
- Unity学习shader笔记[一百]简单焦散Caustic效果
焦散是模仿光透过水底的一个投影景象 有两个版本,改版最后效果如下 这里是简单的基于物体的焦散,基于水体的焦散思路是水面物体的shader中拿到ColorBuffer,然后用水体的屏幕空间坐标取采集Co ...
- Unity海洋shader笔记①
不久前玩了神秘海域4和盗贼之海,对游戏中形状生动颜色通透的大海产生了兴趣,于是开始查着资料学习自己动手写一个海洋的水效渲染.这个shader基本是边学边写的,编写过程中我学到了很多新的知识. 目前的效 ...
- Unity学习笔记(4)-----粒子效果的实现
Unity学习笔记(4)-–粒子效果的实现 一.效果展示 下面用若干张张动图展示效果: 大概就是这样,并不是很难. 实际效果要比图中的好一点(顺畅得多). 实现步骤 大致可以分为如下几个步骤,然后逐个 ...
- Unity中用shader graph制作一个简单的传送门效果
Unity中用shader graph制作一个简单的传送门效果 一.配置渲染管线 1.通过菜单"Asset" --> "Create" --> &q ...
- Unity Shader 之 实现简单的动态过场切换图片的效果
Unity Shader 之 实现简单的动态过场切换图片的效果 目录 Unity Shader 之 实现简单的动态过场切换图片的效果 一.简单介绍
- Unity学习笔记1 简易2D横版RPG游戏制作(一)
这个教程是参考一个YouTube上面的教程做的,原作者的教程做得比较简单,我先参考着做一遍,毕竟我也只是个初学者,还没办法完全自制哈哈.不过我之前也看过一个2D平台游戏的系列教程了,以后会整合起来,做 ...
- 【Unity学习笔记】[Unity中文课堂教程] C#中级编程代码
[Unity学习笔记][Unity中文课堂教程] C#中级编程代码 最近想补一补C#基础,Unity官方的C#中级编程教程质量很高,于是开个帖子把跟着敲+记录了部分价讲解和我自己的理解的代码存在这 原 ...
- 学习Shader Unity Shader 基础
1.如何充分利用 Unity Shader 来为我们的游戏增光添彩? 材质和 Unity Shader: 在Unity中,我们需要配合使用材质(Material)和 Unity Shader 才能达到 ...
- Unity学习笔记:Unity 3D 飞机大战
Unity学习笔记:Unity 3D 飞机大战 1.打开unity软件后,首先新建Quad作为背景,导入飞机模型,并为其添加刚体 然后创建C#脚本,挂载到飞机上. 2.给飞机创建子弹,让子弹成为预制体 ...
最新文章
- python页面调用接口_python调用接口——requests模块
- rsync+inotify一键安装脚本
- syn flood dos
- Mac os android×××,环境配置 mountain lion10.8.2 配置×××环境,并编译源码
- Java笔记——Java代码块的执行顺序
- python OSError: [Errno 24] Too many open files | HTTPConnectionPool(host=‘‘, port=80): Max retries e
- 安农大计算机调剂,2020年安徽农业大学硕士研究生调剂公告
- PHP设计模式之建造者模式
- 033-生产机器扩容
- Cassandra Wiki Login JmxSecurity
- vue.js原生组件化开发(一)——组件开发基础
- 【微信小程序】常用组件及基本使用详解
- html鼠标右键代码,Html鼠标右键菜单代码
- Python画豪华版圣诞树,带漂亮彩灯与文字背景
- 连续系统与离散系统的时域分析
- 企业服务大爆发,HR SaaS的机会与挑战
- BWAPP靶场-HTML injection-Reflected(POST)
- hrm项目-day01
- 基于cocos2d-x的2D空间中的OBB(Orient Bounding Box)碰撞检测算法
- 且看如何用课件制作工具验证完全平方公式