通用特效Shader

一、通用特效Shader介绍

1.1 什么是通用特效材质

Unity支持SRP Batcher后,使用UberShader的优势非常明显。所谓,UberShader,即一个超级Shader,覆盖一类功能,而不是多个分散的小Shader,比如一个通用特效Shader,整个项目内的所有特效都使用该Shader来制作所有的粒子特效或者模型特效,其它需求也类似,比如物体、地形等。

1.2 通用特效材质的意义

1.2.1 方便使用和沟通

整个项目只有一个特效Shader的情况下,美术很容易熟悉该Shader有哪些功能,能够尽可能复用该通用Shader的多个功能制作复杂特效;同时,避免美术与技术美术或者技术重复沟通类似的功能。

1.2.2 方便维护

对于技术美术或者开发同学来说,维护一个Shader的成本比维护多个的成本低很多。对于重复功能不需要再重复开发,优化性能时候也不用满世界扫描美术到底用的是什么Shader,只需要优化这一个Shader性能即可。

1.2.3 批次更低

由于支持SRP Batcher,Unity使用的是最终的变体级别合批。与多个分散小Shader相比,一个Shader质制作的特效更可能被SRP Batcher,因为使用的同一个变体的概率很高,而不同的Shader天然就是不同的变体,不可能被SRP Batcher。因此,只要复用率越高,被合并的批次越多。

1.2 通用特效材质主要模块

主要包括基础功能、Mask、Distortion(扭曲)、Dissolve(溶解)、Emission(自发光)、Reflection(反射)、其它等。每个大的模块都有变体开关,部分消耗大的小功能也需要有变体开关。这里只是列出本人项目中用到过的一些功能,基本上覆盖了常见的特效功能,但是不同项目会有不同的需求,因此除了常见的扭曲、溶解等还会有不少定制功能。这篇文章的目的,不在于介绍这些功能的实现细节,而是说明一个超级特效Shader在项目中使用的意义。

二、通用特效具体模块

2.1 Surface Options(基础设置)

请添加图片描述
Surface Type:不透明或者半透明
Render Face:Front(剔除背面)、Back(剔除前面)、Both(不剔除)
Custom ZWrite:是否覆盖深度写入
ZTest:深度测试
ColorMask:输出颜色通道
Alpha Clipping:Alpha裁剪
Enable Billboard:是否作为Billboard渲染(朝向相机)请添加图片描述

2.2 Surface Inputs (基础输入)

Base Map:基础颜色贴图
Base Color:基础颜色
Enable BackFace Base Color:开启该选项,可以给背面单独制定基础颜色
Apply Vertex Color:开启该选项,顶点颜色应用到基础色上
BaseMap UvType:该设置有UV、ScreenUV、ReflectionUV三种类型。UV模式是使用模型UV0,ScreenUV是使用屏幕空间位置作为UV,ReflectionUV使用反射向量的两个分量比如xz作为UV。ScreenUV和ReflectionUV可以实现一些特殊效果。
BaseMap Rotation:UV模式下,对模型UV0旋转。
BaseMap U Speed:UV的U移动速度。
BaseMap V Speed:UV的V移动速度。
BaseMap Custom Speed (CustomData1.xy, UV0.zw):该功能是使用Unity粒子的CustomData1.xy来作为UV。如下所示的CustomData1.xy是曲线:
请添加图片描述
Normal Map:法线贴图,只在需要使用法线方向时候有意义,比如反射、Matcap等
Normal Scale:法线强度缩放
Normal U Speed:法线的U移动速度。
Normal V Speed:法线的V移动速度。

2.3 Mask Options

请添加图片描述
Mask贴图的作用是修改透明度,在半透明模式下可以只显示通过Mask的区域。

Mask Map ®:Mask贴图,默认使用R通道。
Mask Channel Mask (Default R):Mask贴图的通道掩码。
Mask Rotation:Mask贴图的UV旋转。
Mask U Speed:Mask贴图的U移动速度。
Mask V Speed:Mask贴图的V移动毒素。
Mask Custom Speed (CustomData1.zw, UV1.xy):使用Unity粒子的CustomData1.zw来作为Mask的UV。
Mask Intensity: Mask的强度缩放。
Mask Min:Mask的强度最小值。
Mask Max:Mask的强度最大值。最终的Mask强度会在该范围内SmoothStep。
下面是使用Mask的效果:

2.4 Distortion Options

请添加图片描述
Distortion的功能就是扭曲其它模块的采样UV,比如基础色、自发光、溶解等。
Distortion Map (RG) Mask(A):扭曲贴图,RG通道是扭曲强度,A通道是扭曲Mask。
Distortion Rotation:扭曲的UV旋转。
Distortion U Speed:扭曲的U移动速度。
Distortion V Speed:扭曲的V移动速度。
Distortion Intensity:扭曲的强度缩放。
下面是使用扭曲的效果:

2.5 Dissolve Options

请添加图片描述
Dissolve Map ®:溶解贴图,默认使用R通道。
Dissolve Channel Mask (Default R):溶解贴图的通道掩码。
Dissolve Rotation:溶解贴图的UV旋转。
Dissolve U Speed:溶解贴图的U移动速度。
Dissolve V Speed:溶解贴图的V移动速度。
Dissolve Intensity:溶解强度,注意不是溶解贴图的输入强度缩放。
Dissolve Width:溶解宽度。
Dissolve Edge Color:溶解边缘颜色。
Dissolve Edge Intensity:溶解边缘颜色强度缩放。
Dissolve Hard Edge:是否硬边溶解。
Dissolve Custom Intensity (CustomData2.x, UV1.z):使用粒子系统的CustomData2.x作为溶解强度。
Dissolve Custom Width (CustomData2.y, UV1.w):使用粒子系统的CustomData2.y作为溶解宽度。
溶解的功能比较复杂,最基本的思想是用一张贴图作为溶解强度输入,然后通过在溶解强度和宽度之间计算出溶解阈值,用这个阈值去修改透明度;溶解的边缘颜色则是将溶解阈值应用到单独是边缘颜色上再叠加到输出颜色上;至于硬边溶解是直接将溶解阈值取sign。
有兴趣还原的可以参考下面代码:

	half disslove = dot(SAMPLE_TEXTURE2D(_DissolveMap, sampler_DissolveMap, input.uv3.xy + distortion), _DissolveChannelMask);half dissloveIntensity = input.uv3.z;half dissolveWidth = input.uv3.w;half dissolveWithParticle = (dissloveIntensity * (1 + dissolveWidth) - dissolveWidth);half dissolveAlpha = saturate(smoothstep(dissolveWithParticle, (dissolveWithParticle + dissolveWidth), disslove));color.a *= _DissolveHardEdge ? sign(dissolveAlpha) : dissolveAlpha;color.rgb += _DissolveEdgeColor.rgb * _DissolveEdgeColor.a * _DissolveEdgeIntensity * (_DissolveHardEdge ? sign(1 - dissolveAlpha) : (1 - dissolveAlpha));

下面是使用溶解的效果:

2.6 Emission Options

请添加图片描述
Emission Map:自发光贴图。
EmissionColor:自发光颜色。
Use WorldPos As UV:特殊需求,使用世界空间位置作为UV采样自发光贴图。
Emission U Speed:自发光的U移动速度。
Emission V Speed:自发光的V移动速度。
Emission Intensity:自发光的强度缩放。
自发光的原理比较简单,采样一张额外的自发光贴图叠加颜色,不再赘述。

2.7 RimLight Options

请添加图片描述
RimLight Color:边缘光颜色。
RimLight Width:边缘光宽度。
RimLight Smoothness:边缘光光滑度。
RimLight Intensity:边缘光强度缩放。
RimLight Min:边缘光最小强度。
RimLight Max:边缘光最大强度。
RimLight Reverse:是否反转强度。
边缘光是实际上是计算法线与视线的夹角来判断边缘,当夹角越大边缘光越强,最终将边缘光叠加回输出颜色上。具体代码如下:

half cosTheta = dot(normalWS, viewDirWS);
half rimLightStrength = pow(saturate(1 - 1 / _RimLightWidth * cosTheta), _RimLightSmoothness);
rimLightStrength = (_RimLightReverse ? 1 - rimLightStrength : rimLightStrength) * _RimLightIntensity;
rimLightStrength = smoothstep(_RimLightMinValue, _RimLightMaxValue, rimLightStrength);
color.rgb += _RimLightColor * rimLightStrength;

2.8 Light Options

请添加图片描述
Real Time Light Strength:实时光强度
Real Time Shadow Strength:实时光阴影强度
Real Time Shadow Color:实时光阴影颜色
Real Time Shadow Color Strength:实时光阴影颜色强度
强调一下:这里不是让特效Shader走完整的光照计算,而只是用光源的信息去修改最终的输出颜色。这样性能高效,看起来也在接受光源阴影。

2.9 其它功能

2.9.1 Depth Bias

深度偏移,特效有时候需要偏移深度来强制放在某些物体之前,这个功能比较有效果。

2.9.2 Reflection Options

使用反射方向采样Cubemap,将结果叠加到输出颜色上即可。

2.9.2 Matcap

参考上一篇文章的Matcap,对于特效的matcap可以简单实现即可。

3 关于效果

效果的图片是gif,超过csdn大小限制,具体可以参考通用特效Shader

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

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

相关文章

网络安全SQL初步注入2

六.报错注入 mysql函数 updatexml(1,xpath语法,0) xpath语法常用concat拼接 例如: concat(07e,(查询语句),07e) select table_name from information_schema.tables limit 0,1 七.宽字节注入(如果后台数据库的编码为GBK) url编码:为了防止提交的数据和url中的一些有特殊意…

Golang--面向对象

Golang语言面向对象编程说明: Golang也支持面向对象编程(OOP),但是和传统的面向对象编程有区别,并不是纯粹的面向对象语言。所以我们说Golang支持面向对象编程特性是比较准确的。Golang没有类(class),Go语言的结构体(struct)和其…

英国留学论文写作中复合句式基础知识讲解

从句子的结构出发,复合句式是将两个以上的独立、完整的字句子通过coordinating conjunction或者分号连接在一起。因此,复合句式可以理解成为两个以上的简单句子组合在一起。下面英国翰思教育通过举例的方式,来介绍如何将独立的句子连接在一起…

从奇富科技,QQ钱包看信贷服务、贷款超市的的客户注册认证流程有什么不同

概览 奇富科技作为港股信贷第一企业,目前已服务2.4亿用户,是国内头部信贷科技服务平台。 QQ钱包,作为8亿用户的贷款超市,拥有其他贷款超市产品梦寐以求的流量入口。 产品模式 奇富科技作为信贷科技服务平台,主要提…

寻找伤感短视频素材 这些网站帮你轻松下载无水印资源

无论是制作情感类短视频,还是为抖音视频寻找合适的素材,伤感视频素材一直是创作者们关注的重点。如果你正在为如何找到高质量的伤感素材而困扰,那么今天我将推荐一些非常实用的素材网站,帮助你快速找到适合的伤感视频素材&#xf…

Java项目实战II基于Spring Boot的大学生智能消费记账系统的设计与实现(开发文档+数据库+源码)

目录 一、前言 二、技术介绍 三、系统实现 四、文档参考 五、核心代码 六、源码获取 全栈码农以及毕业设计实战开发,CSDN平台Java领域新星创作者,专注于大学生项目实战开发、讲解和毕业答疑辅导。获取源码联系方式请查看文末 一、前言 在当今社会…

Linux 抓包工具 --- tcpdump

序言 在传输层 Tcp 的学习中,我们了解了 三次握手和四次挥手 的概念,但是看了这么多篇文章,我们也只是停留在 纸上谈兵。  欲知事情如何,我们其实可以尝试去看一下具体的网络包的信息。在这篇文章中将向大家介绍,在 L…

基于Spring Boot+Vue的养老院管理系统【原创】

一.系统开发工具与环境搭建 1.系统设计开发工具 后端使用Java编程语言的Spring boot框架 项目架构:B/S架构 运行环境:win10/win11、jdk17 前端: 技术:框架Vue.js;UI库:ElementUI; 开发工具&…

基于SpringBoot+Vue音乐播放和推荐系统【提供源码+答辩PPT+参考文档+项目部署】

作者简介:✌CSDN新星计划导师、Java领域优质创作者、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和学生毕业项目实战,高校老师/讲师/同行前辈交流。✌ 主要内容:🌟Java项目、Python项目、前端项目、PHP、ASP.NET、人工智能…

震撼!通过双重异步,Excel 10万行数据导入从191秒优化到2秒!

震撼!通过双重异步,Excel 10万行数据导入从191秒优化到2秒! 在现代的企业级应用开发中,海量数据的处理效率和并发性能优化是一个非常重要的课题。无论是大规模数据导入、文件解析,还是在分布式系统中处理高并发任务&a…

Linux编程:用于调试 C、C++ 和其他编程语言编写的程序的调试工具GDB的使用

目录 一、概述 二、 安装GDB 三、准备程序 四、使用GDB 1、启动GDB 2、获取帮助 五、 常用GDB命令 六、示例调试会话 七、其他事项 一、概述 GDB(GNU Debugger)是一个非常强大的调试工具,广泛用于调试 C、C 和其他编程语言编写的程序…

书生实战营第四期-基础岛第五关-XTuner 微调个人小助手认知

基础任务 使用 XTuner 微调 InternLM2-Chat-7B 实现自己的小助手认知 一、环境配置与数据准备 1.构建虚拟环境 cd ~ #git clone 本repo git clone https://github.com/InternLM/Tutorial.git -b camp4 mkdir -p /root/finetune && cd /root/finetune conda create -…

java day04-面向对象基础(内存 封装 继承 修饰符 工具类 )

1.对象内存图 1.1 Java 内存分配 1.2 堆和栈 栈:所有局部变量都会在栈内存中创建 局部变量:定义在方法中的变量或者方法声明上的变量 方法执行都会加载到栈中进行 -----------------------------------------------------------------------------------------…

【C++练习】二进制到十进制的转换器

题目:二进制到十进制的转换器 描述 编写一个程序,将用户输入的8位二进制数转换成对应的十进制数并输出。如果用户输入的二进制数不是8位,则程序应提示用户输入无效,并终止运行。 要求 程序应首先提示用户输入一个8位二进制数。…

Pytorch学习--神经网络--网络模型的保存与读取

一、网络模型的保存与读取方式1 方法讲解 保存模型 import torch import torchvision model torchvision.models.vgg16(weightsDEFAULT) #保存模型和参数 torch.save(model,"save_method1.pth")读取模型 import torch model torch.load("save_method1.pth&…

凸优化理论,凸二次规划问题,对偶问题及KKT条件

凸优化理论 ​ 研究凸优化之前我们不妨提出几个小问题: 什么是优化问题?优化问题的解是什么?什么是凸优化问题?凸优化问题的解决方案是什么? 1.1 优化问题 ​ 理解优化问题其实很简单,我们其实从高中事…

智能的编织:C++中auto的编织艺术

在C的世界里,auto这个关键字就像是一个聪明的助手,它能够自动帮你识别变量的类型,让你的代码更加简洁和清晰。下面,我们就来聊聊auto这个关键字的前世今生,以及它在C11标准中的新用法。 auto的前世 在C11之前&#x…

The Rank-then-Encipher Approach

原始观点 Format-Preserving Encryption 4 The Rank-then-Encipher Approach 引用1 Hybrid diffusion-based visual image encryption for secure cloud storage 2.2 Sum-preserving encryption Bellare introduced the concept of format-preserving encryption (FPE)…

江西省补贴性线上职业技能培训管理平台(刷课系统)

江西省补贴性线上职业技能培训管理平台(刷课系统) 目的是为了刷这个网课 此系统有两个版本一个是脚本运行,另外一个是可视化界面运行 可视化运行 技术栈:flask、vue3 原理: 通过分析网站接口,对某些接口加密的参数进行逆向破解,从而修改请求…

Linux基础4-进程5(程序地址空间详解)

上篇文章:Linux基础4-进程4&#xff08;环境变量&#xff0c;命令行参数详解&#xff09;-CSDN博客 本章重点&#xff1a; 1 重新理解c/c地址空间 2 虚拟地址空间 一. c/c地址空间 地址空间布局图: 运行下列代码&#xff0c;进行观察 #include <stdio.h> #include <…