UnityShaderBook中消融dissolve详解

news2024/12/22 23:33:36

消融这个效果算得上游戏开发中用的比较多的一个效果,表现游戏对象消失的时候经常用到,这个效果实现也非常简单,因此在《UnityShader入门精要》中也就短短几句话讲完了,这里我想针对书中的效果详细讲解一下。

Shader源代码,我这里就不贴出源代码了,可以照着看。

消融效果的核心是使用clip函数,将小于阈值的像素裁剪掉

 首先Disslove中包含两个Pass,一个前向渲染、一个阴影渲染,我们下面挨个解析。

参数说明

 

与消融效果相关的主要有噪声图、阈值。这两个就能实现消融,书中额外使用了Burn Line Width、Burn First Color、Burn Second Color来实现消融前表面先烧焦的效果。

噪声图

这里使用的噪声图类似高斯噪声图,使用这类噪声图可以让消融过渡更加平滑均匀。虽然本书讲的是消融效果,但是我觉得噪声图的选择使用也是一门很值得研究的门道。只要大体符合高斯噪声图规律就能实现比较好的效果。我们只要去拾取噪声图中的像素点,就能发现它们是梯度增加或减少点,这正符合烧毁东西的规律,从多个点扩散

fwdbase顶点着色器

顶点着色器没有什么特别好说明的,计算纹理uv、计算切线空间下的光照方向、计算世界坐标这些对于看了那么久书的你没什么好说明的了。

fwdbase片元着色器

如果只是实现消融,下面代码就能实现

fixed4 frag(v2f i) : SV_Target
{
		//1.采样噪声图
    fixed3 burn = tex2D(_BurnMap, i.uvBurnMap).rgb;
		//2.根据当前Burn(燃烧进度)裁剪片元
    clip(burn.r - _BurnAmount);
		//计算切线空间下的光照方向与法线
		//法线通过UnpackNormal获取,因为需要将采样值映射到[-1,1]区间
		//光照方向就是顶点着色器计算后插值后的结果,在frag中再归一化,可以避免精度丢失
    float3 tangentLightDir = normalize(i.lightDir);
    fixed3 tangentNormal = UnpackNormal(tex2D(_BumpMap, i.uvBumpMap));
		//3.采样反照率纹理
    fixed3 albedo = tex2D(_MainTex, i.uvMainTex).rgb;
    fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz * albedo;
		//计算漫反射,采用半兰伯特
    fixed3 diffuse = _LightColor0.rgb * albedo * max(0, 0.5 * dot(tangentNormal, tangentLightDir) + 0.5);
    UNITY_LIGHT_ATTENUATION(atten, i, i.worldPos);
    fixed3 finalColor = ambient + diffuse * atten;
    return fixed4(finalColor, 1);
}

这个与书中一开始将光照唯一区别就是裁剪掉了像素,实现了消融效果,所以为什么说消融效果很简单呢,就多了这么一句话。

书中增加了点难度,让燃烧效果更加逼真,实现了烧焦区域

//burn.r在这里一定大于_BurnAmount
//_LineWidth区间为[0,0.2]
//smoothstep结果为(0,1]区间内
	//当burn.r - _BurnAmount > _LineWidth时最终t为0,说明火还没烧过来
	//否则存在线性变换
//这里就刚好符合在LineWidth外没有燃烧痕迹的需求
fixed t = 1 - smoothstep(0.0, _LineWidth, burn.r - _BurnAmount);

//在燃烧范围内存在渐进变换
fixed3 burnColor = lerp(_BurnFirstColor, _BurnSecondColor, t);
//增加亮度和对比度
burnColor = pow(burnColor, 5);

UNITY_LIGHT_ATTENUATION(atten, i, i.worldPos);
fixed3 finalColor = lerp(ambient + diffuse * atten, burnColor, t * step(0.0001, _BurnAmount));

具体每句话的解析我写在了上面代码中。这里额外补充一下针对burnColor去计算幂运算的功能,在书中原话“为了让效果更接近烧焦的痕迹,我们还使用 pow 函数对结果进行处理”这句话也没说为什么,让人很难受,下面稍微解释一下

对颜色进行幂运算的意义通常是为了调整颜色的亮度、对比度或饱和度等方面。幂运算可以让颜色值呈现非线性的变化,从而实现更精细的颜色调整效果。

例如,将颜色值进行2次幂运算可以增加颜色的亮度和对比度。而将颜色值进行小于1的幂运算,可以减小颜色的亮度和对比度,同时增加饱和度。

另外,幂运算还可以用于对颜色进行颜色空间转换,例如将颜色值进行gamma校正,以实现更加自然的颜色表现。 

shadowcaster

这个Pass与fwdbase类似,也是裁剪掉消融后的像素

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

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

相关文章

(浙大陈越版)数据结构 第二章 线性结构 2.2 堆栈

目录 2.2.1 什么是堆栈 堆栈 什么是堆栈 例子:计算机如何进行表达式求值?如:56/2-3*4 后缀表达式 堆栈的抽象数据类型描述 2.2.2 堆栈的顺序存储实现 例子:用一个数组实现两个堆栈,要求能最大利用数组空间&…

路径之谜(DFS)-2016年蓝桥杯国赛

路径之谜-2016年国赛 1、题目描述2、解题思路3、代码实现1、题目描述 小明冒充 X 星球的骑士,进入了一个奇怪的城堡。 城堡里边什么都没有,只有方形石头铺成的地面。 假设城堡地面是 nn* 个方格。如下图所示。 按习俗,骑士要从西北角走到东南角。可以横向或纵向移动,但不能…

【Java虚拟机】JVM常见诊断命令和调试工具

1.JVM常用命令行参数jps和jinfo实操 准备测试代码 /*** author lixiang* date 2023/5/4 20:53*/ public class JVMTest {public static void main(String[] args) throws InterruptedException {Thread.sleep(1000000);} }(1)命令jps:全称 …

【exgcd】牛客练习赛 D-青蛙兔子的约会

D-青蛙兔子的约会_牛客练习赛111 (nowcoder.com) 题意: 思路: 感觉和那个青蛙的约会比较像 就是列了个方程: a*xb*yn 考虑用exgcd解方程 然后看x在[L,R]有没有解 做法就是先把x的最小整数解求出来,然后考虑它的通解 xx0b/…

2023年五一数学建模 B 题过程与结果

文章目录 第一问第二问数据时序分析Auto-ARIMA第二问求解解的情况A->Q:D-> AQ-V总快递数 第三问第四问遗传算法求解 第五问SARIMA 模型拟合季节性规律 第一问 见 2023 年 五一杯 B 题过程 代码(第一问) 第二问 第二问考虑是一个时序预测问题&a…

图像生成论文阅读:Latent Diffusion算法笔记

标题:High-Resolution Image Synthesis with Latent Diffusion Models 会议:CVPR2022 论文地址:https://ieeexplore.ieee.org/document/9878449/ 官方代码:https://github.com/CompVis/latent-diffusion 作者单位:慕尼…

数字乡村建设与示范项目可行性研究报告(word可编辑)

本资料来源公开网络,仅供个人学习,请勿商用,如有侵权请联系删除 5.1 “三平台”:建设支撑农业发展农村治理惠民服务的三大应用平 台 5.3.1 建设智慧农业综合服务平台 夯实数字农业基础,推进重要农产品全产业链大数据…

redis服务搭建,C++实现redis客户端,redis远程可视化工具

目录 redis简介redis服务搭建redis常用命令C实现redis客户端redis远程可视化工具:Another Redis DeskTop Manager redis简介 官方网址:https://redis.io/ 开源地址:https://github.com/redis 中文文档:http://www.redis.cn/documentation.ht…

造轮子系列】面试官问:你能手写Vuex吗(一)?

大厂面试题分享 面试题库 前后端面试题库 (面试必备) 推荐:★★★★★ 地址:前端面试题库 web前端面试题库 VS java后端面试题库大全 Vuex 是 Vue.js 的状态管理模式,它主要解决了组件之间共享状态时的问题。在本文…

网络原理之传输层

网络原理,进一步了解网络是如何工作的~~ 按照网络协议这几个层次来展开分为五点: 应用层(重点介绍)传输层(重点介绍)网络层(跳过)数据链路层(跳过)物理层&a…

JavaScript,

JS-引入方式JS-基础语法 书写语法变量数据类型&#xff0c;运算符&#xff0c;控制语句 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"…

Abstract Expressionist

古董地图画集 10大最有名的抽象艺术家 抽象表现主义是现代许多不同艺术思想和表达流派中最奇特的艺术运动之一。这场运动开始从社会变革中涌现出来&#xff0c;恰逢第二次世界大战的最后几周和几个月。 这一次&#xff0c;来自世界各地的人们开始欢迎在经历了多年有史以来最致…

【JavaWeb 用户认证】Cookie、Session、Token、JWT、Interceptor、SpringBoot、Spring Security

Token基本了解&#xff1a;【详细阐述Token的来源】公钥私钥基本了解&#xff1a;【理解公钥】 文章目录 一、Cookie 经典介绍以及使用案例二、Session 经典介绍以及拦截登录案例三、Token MySQL 的基本介绍及其基本使用四、JWT 基本介绍及其基本讲解五、SpringBoot 使用拦截器…

使用PyQt5设计一款简单的计算器

目录 一、环境配置&#xff1a; 二、代码实现 三、主程序 四、总结 本文使用PyQt5设计一款简单的计算器&#xff0c;可以通过界面交互实现加减乘除的功能&#xff0c;希望能够给初学者一些帮助。主要涉及的知识点有类的定义与初始化、类的成员函数、pyqt5的信号与槽函数等。…

LeetCode 牛客单链表OJ题目思路分享

目录 反转链表合并两个有序链表链表分割 反转链表 链接: link 题目描述&#xff1a; 题目思路&#xff1a; 方法1&#xff1a;改变链表链接的方向 方法1思路&#xff1a; 这力我们需要三个指针n1 n2 n3方便我们进行迭代 初始化n1指向NULL&#xff0c;n2指向第一个节点&…

云原生时代崛起的编程语言Go常用标准库实战

文章目录 基础标准库简述字符串-string底层结构函数长度格式化输出 模版-templatetext/templatehtml/template 正则表达式-regexp编码-encodingBase64JSONXML 时间-time网络-netURLHTTP客户端和服务端 加密IO操作读写文件环境变量命令行 数据库排序-sort测试和基准测试 基础标准…

OpenLDAP安装报错

tip:基于centos7&#xff0c;OpenLDAP使用2.4.44版本 只要有succeeded就可以。error可以忽略 配置base.ldif文件&#xff0c;下面的空行是必须的。 dn: dcts,dccom o: ts com dc: ts objectClass: top objectClass: dcObject objectclass: organizationdn: cnManager,dcts,d…

leveldb自定义env

leveldb自定义env 未完待续。。。 由于项目需求&#xff0c;需要自定义LevelDB的env&#xff0c;也就是以块接口实现env中各个文件接口&#xff0c;在网上没找到类似的代码&#xff0c;就打算自己参照util/env_posix.cc实现一个简单的demo&#xff0c;等到功能实现差不多的时候…

ADRV9002官方例程开发过程中遇到的问题

开发环境&#xff1a;Vivado2021.2 HDL版本&#xff1a;hdl_2021_r2 GitHub - analogdevicesinc/hdl at hdl_2021_r2 no-OS版本&#xff1a;no_OS-2021_R2 GitHub - analogdevicesinc/no-OS at 2021_R2 &#xff08;PS&#xff1a;也可以用Vivado2019.1开发&#xff0c…

【漏洞复现】Joomla未授权访问漏洞(CVE-2023-23752)

文章目录 前言声明一、漏洞简介二、影响版本三、环境搭建四、漏洞分析五、漏洞复现六、修复建议前言 Joomla是一套全球知名的内容管理系统(CMS),其使用PHP语言加上MySQL数据库所开发,可以在Linux、Windows、MacOSX等各种不同的平台上运行。 声明 本篇文章仅用于漏洞复现与…