Unity中Shader优化通用规则

news2025/4/17 9:14:06

文章目录

  • 前言
  • 一、精度优化
    • 1、三种精度 fixed / half / float
    • 2、位置坐标、物理坐标类使用float
    • 3、HDR颜色、方向向量类使用half
    • 4、普通纹理、颜色类使用 fixed
    • 5、实际上,使用的精度取决于 平台 和 GPU
    • 6、现在桌面级GPU都是直接采用 float , Shader中的 fixed / half / float最后都是用的 float
    • 7、现代移动端GPU大多仅支持 half 与 float ,所以能用 half 的就用 half
    • 8、fiixed 仅用于较旧的移动 GPU
  • 二、能放顶点着色器的不要放片段着色器中
  • 三、多Pass少用
    • 一个SubShader内如果含有多个Pass(不包含Unity中特殊使用的),则会渲染多次,同时将不能进行合批
  • 四、小心使用 AlphaTest 和 ColorMask
    • AlphaTest :透明测试
    • ColorMask : 输出颜色通道
  • 五、NoScaleOffset :不开启 Tilling 和 Offset面板
  • 六、DisableBatching :不动态合批
    • Unity中合批分为静态合批 和 动态合批
  • 七、GrabPass 抓取屏幕
    • 1、方式一:
    • 2、方式二:
  • 八、Surface Shader :表面着色器
  • 九、ShaderLOD :配置分级
  • 十、Overdraw :同一个像素被渲染多次
  • 十一、变体优化


前言

Unity中Shader优化通用规则


一、精度优化

1、三种精度 fixed / half / float

2、位置坐标、物理坐标类使用float

3、HDR颜色、方向向量类使用half

4、普通纹理、颜色类使用 fixed

5、实际上,使用的精度取决于 平台 和 GPU

6、现在桌面级GPU都是直接采用 float , Shader中的 fixed / half / float最后都是用的 float

7、现代移动端GPU大多仅支持 half 与 float ,所以能用 half 的就用 half

8、fiixed 仅用于较旧的移动 GPU


二、能放顶点着色器的不要放片段着色器中

在这里插入图片描述


三、多Pass少用

一个SubShader内如果含有多个Pass(不包含Unity中特殊使用的),则会渲染多次,同时将不能进行合批


四、小心使用 AlphaTest 和 ColorMask

AlphaTest :透明测试

  • 就是实现消融效果使用的 Clip() 函数。通常在大多数平台上使用 AlphaTest 会有一些性能优势,但是在 IOS 和某些使用 PowerVR GPU 的 Android 设备性能就很低

但是,使用 AlphaTest 是避免不了的。
因为,有很多地方用到 : 树叶透光、草地、网格围栏、渔网袜效果等。不可能通过建模来实现,因为比较消耗性能

ColorMask : 输出颜色通道

  • 在 IOS 和部分 Android 设备上同样性能很低

五、NoScaleOffset :不开启 Tilling 和 Offset面板

[NoScaleOffset][Normal]_NormalTex(“NormalTex”,2D) = “bump” {}

  • 在不需要调节 Tilling 和 Offset 的贴图属性中加入[NoScaleOffset],同时Shader不做相关计算

六、DisableBatching :不动态合批

Tags{“DisableBatching” = “true”}

  • true表示不进行合批
  • false表示能合批就尽量合批,默认值

同时影响 动态合批 与 静态合批
如果顶点上的计算需要在模型的本地空间下进行,则需要开启,否则最好不要开启

Unity中合批分为静态合批 和 动态合批

动态合批:

  • 我们创建两个立方体(赋予同一个材质球)用于测试

  • 在Frame Debugger界面,查看渲染效果

在这里插入图片描述

  • 创建一个Shader并且赋予一个材质

//在Tags{}中添加 DisableBatching 的设置
Tags { “RenderType”=“Opaque” “DisableBatching” = “false”}

  • 运行游戏渲染时,使用同一Shader材质的两个物体,并且没有关闭合批,则会在同一批次渲染

在这里插入图片描述

  • 若开启不动态合批的话,这两个物体会分两次渲染。

//在Tags{}中添加 DisableBatching 的设置
Tags { “RenderType”=“Opaque” “DisableBatching” = “true”}

在这里插入图片描述

  • 并且会在后渲染的物体中,告诉你,不动态合批的原因

在这里插入图片描述

静态合批:

在没运行时,重复上面步骤,就可以看出


七、GrabPass 抓取屏幕

  • GrabPass一般来说,能不用就不用,一般只用在 水扭曲 和 特效扭曲

1、方式一:

  • 若不定义名称则使用Unity默认的贴图名
  • GrabPass如果不指定贴图的名称,则每个对象的GrabPass都会每帧生成一次

GrabPass{}
sampler2D _GrabTexture;

2、方式二:

  • 若定义名称则使用自己定义的贴图名
  • GrabPass如果指定贴图的名称,则所有对象的GrabPass在一帧内只会生成一次

GrabPass{“_GrabTex”}
sampler2D _GrabTex;


八、Surface Shader :表面着色器

Surface Shader 是Unity提供给一些不是专门写Shader的人使用的,有很多的Bug

能不用就不用 Surface Shader(表面着色器)尽量使用 vertex / fragment(顶点片元着色器)


九、ShaderLOD :配置分级

LOD 600

  • 利用ShaderLOD来实现高中低配硬件的区分

十、Overdraw :同一个像素被渲染多次

  • 优化时,可以尽量减少半透明区域、可以减少特效层数、面积

//可以在Shader中使用这个标签来查看 Overdraw 高不高
Tags{“RenderType” = “Transparent”}

RenderType
用来区别这个Shader要渲染的对象是属于什么类别的,你可以想像成是我们把各种不同的物体按我们需要的类型来进行分类一样。
当然你也可以根据需要改成自定义的名称,这样并不会影响到Shader的效果。
此Tag多用于摄像机的替换材质功能(Camera.SetReplacementShader)。

  • 开启后,在Unity编辑界面开启Overdraw即可可见 Overdraw 层数(越亮层数越高)

在这里插入图片描述

在这里插入图片描述


十一、变体优化

  • 变体的数量直接影响 shaderlab 的内存占用,能少则少。

  • 尽量不要去用内置的Standard材质,会生成大量的变体,可以自己修改定制一个

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

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

相关文章

【STM32】OLED显示屏

1 调试方式 1. 串口调试:通过串口通信,将调试信息发送到电脑端,电脑使用串口助手显示调试信息 2. 显示屏调试:直接将显示屏连接到单片机,将调试信息打印在显示屏上 3. Keil调试模式:借助Keil软件的调试模…

直接套用的软件详细设计说明书

软件开发全套资料过去进主页!

Libavutil详解:理论与实战

文章目录 前言一、Libavutil 简介二、AVLog 测试1、示例源码2、运行结果 三、AVDictionary 测试1、示例源码2、运行结果 四、ParseUtil 测试1、示例源码2、运行结果 前言 libavutil 是一个实用库,用于辅助多媒体编程,本文记录 libavutil 库学习及 demo 例…

windows电脑、苹果系统和安卓手机日程提醒双向同步如何操作?

在这个信息飞速传递的时代,我们时常需要在不同设备之间同步日程提醒,而对于同时使用Windows电脑、苹果系统和安卓手机的用户来说,这显得尤为重要。今天,我将分享一个简单的操作,让你在它们之间实现日程提醒的双向同步。…

实现电商平台与营销系统无缝集成:雅座的无代码开发与API连接

无代码开发:营销的新引擎 在数字化转型的浪潮中,无代码开发已成为企业提升效率、减少成本的新引擎。这种开发方式允许非技术人员通过图形界面构建应用程序,无需编写代码即可实现复杂功能。这对于营销、广告推广以及用户运营等业务尤为重要&a…

性能测试:深入理解并发量,线程数,吞吐量,TPS

并发数,线程数,吞吐量,每秒事务数(TPS)都是性能测试领域非常关键的数据和指标。 那么他们之间究竟是怎样的一个对应关系和内在联系? 测试时,我们经常容易将线程数等同于表述为并发数&#xff…

出于隐私和安全的考虑,有时需要从谷歌删除你的个人数据,有两种方法

如果你是公众人物、企业或拥有个人品牌的人,那么拥有在线形象很重要。然而,你可能会发现,通过谷歌搜索,陌生人可以获得你的个人信息,如联系方式、地址和财务信息,这会让你感到不安。 幸运的是,…

记 Doris 回归测试S3导入load_parallelism > 1

增加load_parallelism > 1的S3导入用例,测试导入时切分输入文件的逻辑。 这里有几个隐性的问题点(坑): 1、导入的文件一定要大,一般大于128M,否则,即使设置了 load_parallelism > 1 也不…

Linux基础项目开发1:量产工具——输入系统(三)

前言: 前面我们已经实现了显示系统,现在我们来实现输入系统,与显示系统类似,下面让我们一起来对输入系统进行学习搭建吧 目录 一、数据结构抽象 1. 数据本身 2. 设备本身: 3. input_manager.h 二、触摸屏编程 to…

甘草书店记:2023年10月15日 星期日 「等待也是人生的大事」

我常说,最好的人生是刚刚好。 财富不可少,也不必多,够用就好。爱情不要晚,也不要早,恰好就好。 可是人生活在社会中、自然中,不会万事由己。所以,等待是人生的必修课。 书店的装修设计和LOGO…

2023-11-29 LeetCode每日一题(无限集中的最小数字)

2023-11-29每日一题 一、题目编号 2336. 无限集中的最小数字二、题目链接 点击跳转到题目位置 三、题目描述 现有一个包含所有正整数的集合 [1, 2, 3, 4, 5, …] 。 实现 SmallestInfiniteSet 类: SmallestInfiniteSet() 初始化 SmallestInfiniteSet 对象以包…

Matlab 在一个文件中调用另一个文件中的函数

文章目录 Part.I IntroductionPart.II 方法Chap.I A 文件中只有一个函数Chap.II A 文件中有多个函数 Part.I Introduction 本文介绍一下在脚本文件 B 中调用文件 A 中的函数的方法。 Part.II 方法 目的:在文件B.m调用A.m中的函数 默认两个文件在一个文件夹下&…

汽车销售简历模板(精选19篇)

汽车销售简历(在线制作下载):百度幻主简历 汽车销售求职简历1: 求职意向 求职类型:全职 意向岗位:汽车销售顾问 意向城市:广东广州 薪资要求:面议 求职状态&…

2948. 交换得到字典序最小的数组 (分组排序)

Problem: 2948. 交换得到字典序最小的数组 文章目录 题目思路Code 题目 给你一个下标从 0 开始的 正整数 数组 nums 和一个 正整数 limit 。 在一次操作中&#xff0c;你可以选择任意两个下标 i 和 j&#xff0c;如果 满足 |nums[i] - nums[j]| < limit &#xff0c;则交换…

用bat制作图片马——一句话木马

效果图 代码 ECHO OFF TITLE PtoR MODE con COLS55 LINES25 color 0A:main cls echo.当前时间&#xff1a;%date% %time% echo.欢迎使用图片马制作工具 echo.请确保图片和php在同一路径下 echo.echo 请将图像文件拖放到此窗口并按 Enter&#xff1a; set /p "imagefile&q…

C语言——深入理解指针(3)

目录 1. 字符指针 2. 数组指针 2.1 数组指针变量 2.2 数组指针变量的初始化 3.二维数组传参&#xff08;本质&#xff09; 4. 函数指针 4.1 函数指针变量的创建 4.2 函数指针的使用 4.3 typedef 5. 函数指针数组 6. 转移表&#xff08;函数指针数组的使用&#xff…

PlantUML语法(全)及使用教程-类图

目录 1. 类图1.1、什么是类图1.2、元素声明1.3、类之间的关系1.4、关系上的标签1.5、在元素名称和关系标签中使用非字母1.6、添加方法 1. 类图 类图的设计语法与编程语言的传统语法相似。这种相似性为开发人员提供了一个熟悉的环境&#xff0c;从而使创建图表的过程更简单、更直…

如何集成一个TypeScript开发环境?

首先要安装个node.js。Node.js (nodejs.org) 然后我们随便建一个文件夹&#xff0c;并且打开它运行到终端 然后再运行命令&#xff1a; npm install typescript -g 成功后 尝试使用 tsc -v 查看版本 接下来再使用命令&#xff1a; tsc --init 我们在.ts文件中尝试输出一些…

UCSC基因组浏览器用法

UCSC基因组浏览器用法 UCSC基因组浏览器是一个强大的在线工具&#xff0c;主要用于查看和分析多种生物的基因组数据。这个浏览器最初是由加利福尼亚大学圣克鲁兹分校的生物信息学家和计算生物学家开发的&#xff0c;旨在为科研人员提供一个易于访问和使用的界面&#xff0c;用于…

Unity中Shader变体优化

文章目录 前言一、在Unity中查看变体个数&#xff0c;以及有哪些变体二、若使用预定义的变体太多&#xff0c;我们只使用其中的几个变体&#xff0c;我们该怎么做优化一&#xff1a;可以直接定义需要的那个变体优化二&#xff1a;使用 skip_variants 剔除不需要的变体 三、变体…