通用特效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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

spark-本地模式的配置和简单使用

python环境的安装 在虚拟机中,只能安装一个python的版本,若想要安装别的版本,则需要卸载之前的版本——解决方式,安装Anaconda 通过百度网盘分享的文件:Anaconda3-2021.05-Linux-x86_64.sh 链接:https://…

分享三个python爬虫案例

一、爬取豆瓣电影排行榜Top250存储到Excel文件 近年来,Python在数据爬取和处理方面的应用越来越广泛。本文将介绍一个基于Python的爬虫程序,用于抓取豆瓣电影Top250的相关信息,并将其保存为Excel文件。 获取网页数据的函数,包括以…

PyQt5 详细安装与配置教程及使用

文章目录 Part1:安装 PyQt5Part2:配置 PyQt5 的依赖工具 QtDesigner 和 PyUICPart3:使用QtDesigner设计界面Part4:使用PyUIC将设计好的界面转换为.py文件Part5:通过代码显示ui界面 Part1:安装 PyQt5 需要安…

ssm079基于SSM框架云趣科技客户管理系统+jsp(论文+源码)_kaic

毕 业 设 计(论 文) 题目:客户管理系统设计与实现 摘 要 现代经济快节奏发展以及不断完善升级的信息化技术,让传统数据信息的管理升级为软件存储,归纳,集中处理数据信息的管理方式。本客户管理系统就是在这…

C语言 | Leetcode C语言题解之第556题下一个更大元素III

题目&#xff1a; 题解&#xff1a; int nextGreaterElement(int n){int x n, cnt 1;for (; x > 10 && x / 10 % 10 > x % 10; x / 10) {cnt;}x / 10;if (x 0) {return -1;}int targetDigit x % 10;int x2 n, cnt2 0;for (; x2 % 10 < targetDigit; x2…

华为大变革?仓颉编程语言会代替ArkTS吗?

在华为鸿蒙生态系统中&#xff0c;编程语言的选择一直是开发者关注的焦点。近期&#xff0c;华为推出了自研的通用编程语言——仓颉编程语言&#xff0c;这引发了关于仓颉是否会取代ArkTS的讨论。本文将从多个角度分析这两种语言的特点、应用场景及未来趋势&#xff0c;探讨仓颉…

Linux:基本开发工具

一&#xff1a;编辑器vim 1.1vim的基本概念 vim其实有多重模式&#xff0c;这里我们主要了解vim的三种模式&#xff0c;分别是命令模式&#xff08;command mode&#xff09;,插入模式(Insert mode)和底行模式(lst line mode) 正常/普通/命令模式(Normal mode) …

第14张 GROUP BY 分组

一、分组功能介绍 使用group by关键字通过某个字段进行分组&#xff0c;对分完组的数据分别 “SELECT 聚合函数”查询结果。 1.1 语法 SELECT column, group_function(column) FROM table [WHERE condition] [GROUP BY group_by_expression] [ORDER BY column]; 明确&#…

TVM计算图分割--BYOC框架

文章目录 BYOC架构算子标注单算子标注复合算子标注Cost-based PartitionCodegenCodegen for C代码生成流程概览代码生成工程实现实现CodegenC实现CSourceCodegenCodegen for JSON实现JsonCodegenRuntimeJSONRuntime参考随着后端设备数量激增,为达到较高的效果在这些设备上,对…

计算机毕业设计Python+卷积神经网络股票预测系统 股票推荐系统 股票可视化 股票数据分析 量化交易系统 股票爬虫 股票K线图 大数据毕业设计 AI

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…

qt QShortcut详解

1、概述 QShortcut是Qt框架中的一个类&#xff0c;它提供了一种创建键盘快捷键的方式。通过QShortcut&#xff0c;开发者可以将特定的键盘组合&#xff08;如CtrlC、AltF4等&#xff09;与应用程序中的动作&#xff08;如复制、关闭窗口等&#xff09;关联起来。当用户在应用程…

C++OJ_二叉树的层序遍历

✨✨ 欢迎大家来到小伞的大讲堂✨✨ &#x1f388;&#x1f388;养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; 所属专栏&#xff1a;C_OJ 小伞的主页&#xff1a;xiaosan_blog 二叉树的层序遍历 102. 二叉树的层序遍历 - 力扣&#xff08;LeetCode&#xff0…

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)…

DolphinDB 与南方科技大学联合授课啦!

11月1日&#xff0c;南方科技大学商学院和 DolphinDB 联合举办了高校课程讲座。讲座由南方科技大学商学院高级研究学者冯鹏举主持&#xff0c;DolphinDB 创始人兼 CEO 周小华博士、某百亿私募数据平台架构师潜蛟老师进行精彩演讲。 Part 1 : 大数据时代下数据库架构革新与生态…

IDM扩展添加到Edge浏览器

IDM扩展添加到Edge浏览器 一般情况下&#xff0c;当安装IDM软件后&#xff0c;该软件将会自动将IDM Integration Module浏览器扩展安装到Edge浏览器上&#xff0c;但在某些情况下&#xff0c;需要我们手动安装&#xff0c;以下为手动安装步骤 手动安装IDM扩展到Edge浏览器 打…

403 Request Entity Too Lager(请求体太大啦)

昨天收到 QA 的生产报障&#xff0c;说是测试环境的附件上传功能报了 403 的错误&#xff0c;错误信息&#xff1a;403 Request Entity Too Lager。我尝试复现问题&#xff0c;发现传个几兆的文件都费劲啊&#xff0c;一传一个失败。不用说&#xff0c;项目用到 ng 代理&#x…

HARCT 2025 新增分论坛2:机器人系统智能控制

会议名称&#xff1a;机电液一体化与先进机器人控制技术国际会议 会议简称&#xff1a;HARCT 2025 大会时间&#xff1a;2025年1月3日-6日 大会地点&#xff1a;中国桂林 主办单位&#xff1a;桂林航天工业学院、广西大学、桂林电子科技大学、桂林理工大学 协办单位&#…

网络世界中的侦察兵----ICMP

前言 学习了IP协议后&#xff0c;都知道IP协议本身是不提供可靠性保障的&#xff0c;那么数据包在这么复杂的互联网环境中传输&#xff0c;总会遇到问题&#xff0c;如果遇到问题后&#xff0c;被丢弃、无回应&#xff0c;可能作为工程师的我们来说都不知道发生了什么事&#…

从0开始学习机器学习--Day21--算法的评估标准

准确率和召回率(precision and recall) 在上一章我们提到了在每次运行算法时通过返回一个实数值来判断算法的好坏&#xff0c;但是我们该如何构建这个实数的计算公式呢&#xff0c;毕竟这关乎于我们对算法的判断&#xff0c;不能过于夸大或贬低。有一个典型的会被影响的很大例…

集群架构中Lua脚本的限制以及出现的报错

&#x1f680; 博主介绍&#xff1a;大家好&#xff0c;我是无休居士&#xff01;一枚任职于一线Top3互联网大厂的Java开发工程师&#xff01; &#x1f680; &#x1f31f; 在这里&#xff0c;你将找到通往Java技术大门的钥匙。作为一个爱敲代码技术人&#xff0c;我不仅热衷…