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 :透明测试
    • 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材质,会生成大量的变体,可以自己修改定制一个

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

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

相关文章

【Linux】ln命令使用

ln命令 ln是linux中又一个非常重要命令,请大家一定要熟悉。它的功能是为某一个文件在另外一个位置建立一个同步的链接,这个命令最常用的参数是-s,具体用法是:ln –s 源文件 目标文件。 当我们需要在不同的目录,用到相…

分享5款靠谱好用,无广告不流氓的好软件

​ 话不多说,直入正题,全都是靠谱好用,无广告不流氓的好软件,可以先点赞收藏,以后慢慢用。 1.动态壁纸软件——Lively Wallpaper ​ Lively Wallpaper是一款可以将视频、GIF、网页、游戏等内容作为桌面壁纸的软件&am…

移动硬盘显示容量不显示文件怎么办?五种解决方法

移动硬盘是一种常用的便携式存储设备,可以方便地备份和传输大量的数据文件。然而,有时我们可能会遇到一个问题,即移动硬盘显示容量不显示文件怎么办?本文将介绍几种解决方法,希望能帮助大家有效解决问题。 方法一、检…

【JavaWeb】会话过滤器监听器

会话&过滤器&监听器 文章目录 会话&过滤器&监听器一、会话1.1 Cookie1.2 Session1.3 三大域对象 二、过滤器三、监听器3.1 application域监听器3.2 session域监听器3.3 request域监听器3.4 session域的两个特殊监听器3.4.1 session绑定监听器3.4.2 钝化活化监听…

IEC60730-1 Annex-H

IEC-60730安全标准法规由国际电工委员会 ( IEC ) 制定,该安全标准定义了家用电器嵌入式控制软件与硬件安全操作的测试与检测方法,以确保家电中受控设备的安全操作。IEC-60730将家用电器分为3类: A类 – 不用于确保设备的安全性。 例如&#…

深入了解Java8新特性-日期时间API之TemporalQuery、TemporalQueries

阅读建议 嗨,伙计!刷到这篇文章咱们就是有缘人,在阅读这篇文章前我有一些建议: 本篇文章大概2000多字,预计阅读时间长需要5分钟。本篇文章的实战性、理论性较强,是一篇质量分数较高的技术干货文章&#x…

国外客户跟我要佣金,该给不该给?

“Jack,这次你要是不帮我,我就死定了!” 收到美国公司采购Antony的信息时,我有些哭笑不得,因为在我电脑屏幕上除了他的信息外,还有来自他公司监察部门的邮件: “jack先生,我们调查…

PostgreSQL-SQL联表查询LEFT JOIN 数据去重复

我们在使用left join联表查询时,如果table1中的一条记录对应了table2的多条记录,则会重复查出id相同的多条记录。 1、解决方法一 SELECT t1.* FROM table1 t1 LEFT JOIN table2 t2 ON t1.id t2.tid 第一种方法我们发现还是有重复数据 2、解决方法二…

go elasticsearch 测试实例

// 查询列表数据 func QueryOperateList(ctx context.Context, esClient *elastic.Client, index string, pageNum, pageSize int, start, end int64, execSql string, list []interface{}, operateAccount string, operateAddr string, maxRows, minRows int, dbAddr, namespa…

版本控制系统Git学习笔记-Git基本知识介绍

目录 前言一、版本控制系统1.1 什么是版本控制系统1.2 本地版本控制系统1.3 集中化的版本控制系统1.3 分布式版本控制系统 二、Git简介2.1 数据处理方式2.2 几个特点2.2.1 几乎所有操作都是本地执行2.2.2 Git保证完整性2.2.3 Git一般只添加数据 2.3 Git中文件状态2.3.1 三种文件…

抖音直播招聘报白如何提高求职者体验?

为了提升抖音直播招聘报白中求职者的体验,以下是一些建议: 提供清晰的招聘流程和信息。在直播招聘开始之前,企业或人力资源公司应提供清晰的流程和信息,包括直播时间和直播平台, 职位信息,招聘要求等&…

为什么要在项目中使用TypeScript?

随着越来越多的开发人员采用TypeScript,人们需要了解在下一个项目中应该使用TypeScript的原因。尽管它在早期应用中遇到了一些阻力,但在过去十年,它迅速成为一种广泛使用的编程语言。 以下介绍如何使用TypeScript以及它给开发人员带来的一些好…

Java核心知识点整理大全24-笔记

22. 数据结构 22.1.1. 栈(stack) 栈(stack)是限制插入和删除只能在一个位置上进行的表,该位置是表的末端,叫做栈顶 (top)。它是后进先出(LIFO)的。对栈的基…

思维模型 仰巴脚效应

本系列文章 主要是 分享 思维模型,涉及各个领域,重在提升认知。不完美才美。 1 仰巴脚效应的应用 1.1 “仰巴脚效应”在人际沟通领域的应用 美国总统罗斯福在竞选总统时,曾经有一位歌唱家计划为他举办一场音乐会以助选。然而,这…

波特图频率定位

生产波特图 设置坐标轴到指定位置 截至频率设置到-3db 对应的频率为158.777 Hz 同理就算对应的容抗 为 1002欧姆电阻 通过计算对应的阻抗。 特此记录 anlog 2023年11月30日

瑜伽学习零基础入门,各种瑜伽教学方法全集

一、教程描述 练习瑜伽的好处多多,能够保证平衡健康的身体基础,提升气质、塑造形体、陶冶情操,等等。本套教程是瑜伽的组合教程,共由33套视频教程组合而成,包含了塑身纤体,速效瘦身,四季养生&a…

SpringCloudAlibaba微服务 【实用篇】| Nacos配置管理

目录 一:Nacos配置管理 1. 统一配置管理 2. 配置热更新 3. 配置共享 4. 搭建Nacos集群 tips:前些天突然发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家,感兴趣的同学可以进…

InfluxDB相关概念

概念 database:数据库,用来针对于不同应用进行数据隔离measurement:数据库中的表,类似与关系型数据库中 tablepoints:表里面的一行数据。相当于关系库中表中一条记录,由时间戳(time&#xff09…

数据库系统原理——备考计划2:数据库系统的概述

前言: 基于课本、上课ppt、复习总结ppt进行一个知识点的罗列,方便后期高效地复习 目录 前言: 一、基本概念 1.数据: (1)概念: (2)数据的种类: (3&…

VSCode搭建STM32开发环境

1、下载安装文件 链接:https://pan.baidu.com/s/1WnpDTgYBobiZaXh80pn5FQ 2、安装VSCodeUserSetup-x64-1.78.2.exe软件 3、 在VSCode中安装必要的插件 3、配置Keil Assistant插件 4、在环境变量中部署mingw64编译环境