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

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

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

相关文章

J2EE征程——第一个纯servletCURD

第一个纯servletCURD 前言在此之前 一,概述二、CURD1介绍2查询并列表显示准备实体类country编写 CountryListServlet配置web.xml为web应用导入mysql-jdbc的jar包 3增加准备增加的页面addc.html编写 CAddServlet配置web.xml测试 4删除修改CountryListServlet&#xf…

RabbitMQ消息模型之Routing-Topic

Routing Topic Topic类型的Exchange与Direct相比,都是可以根据RoutingKey把消息路由到不同的队列。只不过Topic类型Exchange可以让队列在绑定Routing key的时候使用通配符!这种模型Routingkey一般都是由一个或多个单词组成,多个单词之间以”…

ESP32-Web-Server编程- WebSocket 编程

ESP32-Web-Server编程- WebSocket 编程 概述 在前述 ESP32-Web-Server 实战编程-通过网页控制设备的 GPIO 中,我们创建了一个基于 HTTP 协议的 ESP32 Web 服务器,每当浏览器向 Web 服务器发送请求,我们将 HTML/CSS 文件提供给浏览器。 使用…

智能手表上的音频(四):语音通话

上篇讲了智能手表上音频文件播放。本篇开始讲语音通话。同音频播放一样有两种case:内置codec和BT。先看这两种case下audio data path,分别如下图: 内置codec下的语音通话audio data path 蓝牙下的语音通话audio data path 从上面两张图可以看…

纯js实现录屏并保存视频到本地的尝试

前言:先了解下:navigator.mediaDevices,mediaDevices 是 Navigator 只读属性,返回一个 MediaDevices 对象,该对象可提供对相机和麦克风等媒体输入设备的连接访问,也包括屏幕共享。 const media navigator…

【刷题】DFS

DFS 递归: 1.判断是否失败终止 2.判断是否成功终止,如果成功的,记录一个成果 3.遍历各种选择,在这部分可以进行剪枝 4.在每种情况下进行DFS,并进行回退。 199. 二叉树的右视图 给定一个二叉树的 根节点 root&#x…

深度学习之十二(图像翻译AI算法--UNIT(Unified Neural Translation))

概念 UNIT(Unified Neural Translation)是一种用于图像翻译的 AI 模型。它是一种基于生成对抗网络(GAN)的框架,用于将图像从一个域转换到另一个域。在图像翻译中,这意味着将一个风格或内容的图像转换为另一个风格或内容的图像,而不改变图像的内容或语义。 UNIT 的核心…

IDEA2022 Git 回滚及回滚内容恢复

IDEA2022 Git 回滚 ①选择要回滚的地方,右键选择 ②选择要回滚的模式 ③开始回滚 ④soft模式回滚的内容会保留在暂存区 ⑤输入git push -f ,然后重新提交,即可同步远程 注意观察IDEA右下角分支的标记,蓝色代表远程内容未同步到本…

数据结构 / day06 作业

1.下面的代码打印在屏幕上的值是多少? /下面的代码打印在屏幕上的值是多少?#include "stdio.h"int compute_data(int arr[], unsigned int len) {long long int result 0;if(result len)return arr[0];resultcompute_data(arr,--len);printf("len%d, res…

elementui中table进行表单验证

<el-form :model"ruleForm" ref"ruleForm" class"demo-ruleForm"><el-table :data"ruleForm.tableDataShou" border style"width: 100%;"><el-table-column type"index" label"序号" wi…

【23种设计模式·全精解析 | 自定义Spring框架篇】Spring核心源码分析+自定义Spring的IOC功能,依赖注入功能

文章目录 ⭐⭐⭐Spring核心源码分析自定义Spring框架⭐⭐⭐一、Spring使用回顾二、Spring核心功能结构1、Spring核心功能2、bean概述 三、Spring IOC相关接口分析1、BeanFactory解析2、BeanDefinition解析3、BeanDefinitionReader解析4、BeanDefinitionRegistry解析5、创建容器…

伪集群配置

编辑core-site 配置core-site 配置hdfs-site 将以下的文件配置进去 启动一下hadoop产生tmp文件 产生这个叫namenode的文件并格式化 回到~目录 再配置以下信息 配置以下信息 重启文件 再重新格式化配置namenode 再启动一下&#xff0c;然后jps看看&#xff0c;出现这样就…

java后端自学总结

自学总结 MessageSource国际化接口总结 MessageSource国际化接口 今天第一次使用MessageSource接口,比较意外遇到了一些坑 messageSource是spring中的转换消息接口&#xff0c;提供了国际化信息的能力。MessageSource用于解析 消息&#xff0c;并支持消息的参数化和国际化。 S…

运维知识点-openResty

openResty 企业级实战——畅购商城SpringCloud-网站首页高可用解决方案-openRestynginxlua——实现广告缓存测试企业级实战——畅购商城SpringCloud-网站首页高可用解决方案-openRestynginxlua——OpenResty 企业级实战——畅购商城SpringCloud-网站首页高可用解决方案-openRes…

优化器原理——权重衰减(weight_decay)

优化器原理——权重衰减&#xff08;weight_decay&#xff09; weight_decay的作用 原理解析 实验观察 在深度学习中&#xff0c;优化器的 weight_decay 参数扮演着至关重要的角色。它主要用于实现正则化&#xff0c;以防止模型过拟合。过拟合是指模型在训练数据上表现优异&…

从意义中恢复,而不是从数据包中恢复

从书报&#xff0c;录放机&#xff0c;电视机到智能手机&#xff0c;vr 眼镜&#xff0c;所有学习的&#xff0c;娱乐的工具或玩具&#xff0c;几乎都以光声诉诸视听&#xff0c;一块屏幕和一个喇叭。 视觉和听觉对任何动物都是收发信息的核心&#xff0c;诉诸视觉和听觉的光和…

机器学习笔记 - 3D数据的常见表示方式

一、简述 从单一角度而自动合成3D数据是人类视觉和大脑的基本功能,这对计算机视觉算法来说是比较难的。但随着LiDAR、RGB-D 相机(RealSense、Kinect)和3D扫描仪等3D传感器的普及和价格的降低,3D 采集技术的最新进展取得了巨大飞跃。与广泛使用的 2D 数据不同,3D 数据具有丰…

[node] Node.js 中Stream流

[node] Node.js 中Stream流 什么是 Stream流操作从流中读取数据写入流管道流链式流 什么是 Stream Stream 是一个抽象接口&#xff0c;Node 中有很多对象实现了这个接口。例如&#xff0c;对http 服务器发起请求的request 对象就是一个 Stream&#xff0c;还有stdout&#xff…

(C++)复写零--双指针法

个人主页&#xff1a;Lei宝啊 愿所有美好如期而遇 力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台备战技术面试&#xff1f;力扣提供海量技术面试资源&#xff0c;帮助你高效提升编程技能&#xff0c;轻松拿下世界 IT 名企 Dream Offer。https://le…

ESP32-Web-Server 实战编程- 使用 AJAX 自动更新网页内容

ESP32-Web-Server 实战编程- 使用 AJAX 自动更新网页内容 概述 什么是 AJAX &#xff1f; AJAX Asynchronous JavaScript and XML&#xff08;异步的 JavaScript 和 XML&#xff09;。 AJAX 是一种用于创建快速动态网页的技术。 传统的网页&#xff08;不使用 AJAX&#…