您好、欢迎来到现金彩票网!
当前位置:2019正版免费全年资料 > 通道命令字 >

Unity Shader - Making multiple shader program variants 制作s

发布时间:2019-06-26 20:31 来源:未知 编辑:admin

  通常它将方便保留大部分shader代码是不变得,但允许少量不同的shader “variants” 将会被生成。这通常叫超集shader( “mega shaders” or “uber shaders” ),变体是根据shader代码中的预处理指令的每种情况,分别编译多次,编译出不同版本的变体。

  这个例子的指令将生成2个shader变体:一个是FANCY_STUFF_OFF定义的,另一个是FANCY_STUFF_ON。在运行时,Unity可在Material或是全局的shader关键字中激活它们的其一。如果两个关键字都启用了,那么将会只用第一个(如上面例子中,只会使用FANCY_STUFF_OFF)。

  生成一个无变体宏定义的shader,添加一个名为下滑线即可(__)。这是中很常用的技术,用来避免使用两个关键字来做开关,因为在一个项目中,关键字的数量是有限的(查看后面的小节Keyword limits)。例如:

  这个指令生成的shader变体有:一个啥也没定义的(__),和另一个使用FOO_ON定义的。

  shader_feature与multi_compile非常类似。它们唯一的区别是:使用shader_feature的话,在unity构建发布时,是不会包含上未启用的 shader_feature 的变体代码。就为这个原因,你就应该使用shader_feature来给你的材质定义关键字,而multi_compile对应从代码中来设置全局关键字的方式比较适合。

  如果你提供的multi_compile有多行定义,Unity最终编译将尽可能的将这些行分别组合。例如:

  第一行生成3个变体,而第二行是2个。但总的变体数量为6个(A+D,B+D,C+D,A+E,B+E,CE)。

  (假设有3行,每行有:A,B,C个,总量就是:ABC个,所以multi_compile 定义行,且每个都用在代码定义判断,那么该shader编译出来的变体就会非常的多,导致shader资源变得很大。)

  你可以将每一行的multi_compile看作是控制shader的一个feature(功能特性)。要记住,这种方式会使shader变体数量极快速的增长。例如,10行multi_compile特性定义,每行2个,那么最后将会生成 1024 个shader变体。

  在Unity中的shader变体关键字的数量限制最多为256个(全局关键字256个,注意是全局的,因为下面还会介绍局部的),而Unity内部本身使用了60个(因此用户能使用量就是(256-60)个)。关键字在Unity项目中是全局启用的,所以当你在几个不同的着色器中定义多个关键字时,请注意不要超过这个限制。

  局部指令将保留定义的关键字都在定义它们的shader里,而不是引用于整个项目的。就为了这个原因,你就应该使用局部的关键字来替代全局关键字,除非你需要通常全局的脚本API来控制指定的关键字的启用/禁用。

  当你使用关键字时,你可能会看到对性能的影响,但这都取决于你的项目是如何使用关键字的。每个shader的局部和全局关键字的总数都会影响性能:尽量以这种方式处理,尽量使用局部关键字,而少些使用全局关键字,每个shader都尽可能的减少关键字的总数量。

  该指令将生成2个shader变体:一个无定义的(__),和另一个FOO_ON的局部关键字。

  编译shader多变体也有那么一些快捷的符号。它们大多数用于处理不同的光照,阴影和静态烘焙图。查看文档rendering pipeline了解详情。

  编译处理PassType.ForwardBase所需要的。这些变体分别处理不同类型的静态光照烘焙图,和主要方向光阴影的启用或禁用。

  编译处理PassType.ForwardAdd所需要的。这些变体分别处理方向光,聚灯光,或点光源类型和他们不同的烘焙贴图。

  处理了一些不同雾化类型处理的变体(雾化算法模型:off/linear/exp/exp2)

  多数内置的关键字快捷方式都会生出许多的shader变体。如果你的项目不需要其他的一些功能,你可以使用#pragma skip_variatns来跳过一个变体的编译。例如:

  这个指令跳过了所有包含POINT或是POINT_COOKIE的变体编译。

  shader的硬件变体允许给你提供对不同的硬件兼容做特殊的优化。你可以简单的创建能高效运行在指定平台的高度和低端的硬件的shader(如:OpenGL ES)。

  使用这些变体来为低端或高端硬件编写能保底运行或是额外功能的shader。在Unity编辑中,你可以使用图形仿真菜单(旧版本在:Editor-Grapphics Emulation,新版本(2019)在:Editor-Graphics Tiers,可以叫:图像级别)来测试任意的硬件级别,你可以在那里改变每个硬件级别。

  为了让变体尽可能的小,Unity仅会发布运行后只加载一种。相同的shader(例如,如果你仅为TIER1级别的写一些版本,且其他的都一样)它们不会占用额外的硬盘空间。

  在加载时,Unity会去检测GPU而自动选择对应的TIER级别。如果不能自动检测出GPU的硬件标准则默认使用最高级别的TIER值。你可以设置Shader.globalShaderHardwareTier(Shader.globalShaderHardwareTier是旧版本的,新版本现在使用的是UnityEngine.Graphics.activeTier)来重置TIER值,但你必须在Unity加载shader变体前设置。一个比较好的位置是,将设置 TIER 的脚本放到预加载场景,该预加载场景是加载主场景前就加载的,只要确保这个预加载场景有没任何shader加载就好了,这样可以减少BUG,可更好的维护。

  注意注意:(可以不看,因为现在都2019.1版本的文档了,但官方对于这个Platform shader settings的说明不是一般的混乱,在unity的论坛也是很多人吐槽不是一般的乱,所以这里翻译Platform shader settings,就不要看了,因为实在写得乱七八糟,而且很多旧的文档也没及时更新。)

  (如果要实现游戏中画面设置:底,中,该之类的,还是自己用multi_compile来实现shader的质量选择,当然有些是脚本所以的,也是需要自己来控制的)

  最近遇到了一个问题,角色在Unity编辑器里运行渲染结果都是好的,打包到IOS上却发现,角色身上渲染的很黑.花了些时间查了查,又试了试,把这方面算是初步弄清楚了。先说出现问题的原因,由于我们把sh...博文来自:long0801的博客

  课程目标:顶点转换像素着色Shader属性从顶点着色器传递数据到片段着色器查看编译的shader代码使用tiling和offset属性从纹理取样 这是渲染的第二部分教程。第一部分讲解了矩阵。现在是时候...博文来自:qingshui37的专栏

  主要使用噪声和透明度测试,从噪声图中读取某个通道的值,然后使用该值进行透明度测试。主要代码如下:fixedcutout=tex2D(_NoiseTex,i.uvNoiseTex).r;clip(cut...博文来自:编程大师的博客

  5月份的时候参加了Unite北京的开发者大会,这里来分享一下。PPt不是特别全,但是主要内容都有了,所以这边我就来说一下。这里主要说Vertfragshader和surfaceshader的优化,不讲...博文来自:霜狼_May的博客

  现在使用的Unity制作的游戏基本上都在使用AssetBundle,但是AssetBundle有很多坑,一个比较常见的坑就是会使包体变大,而且占用的内存和显存都会变高。把shader和模型分开打包就是...博文来自:weixin_38928355的博客

  最近一直在忙着学习和制作关于网络加载的一些问题,毕竟在现在和将来网络应用是个永恒不变的主流内容.继续上次的说,如果尝试了上面的pass就会知道,他只能适用于类似于球体这样的模型,如果换做有棱角的模型,...博文来自:如同神临的博客

  想必很多研发者都会对ShaderLab内存的优化头疼不已,在寸土寸金的内存中,它常常占据了不容忽视的体量,而比起其他资源内存,它更像一个“黑盒”,让我们优化的时候难以入手。为此,我们通过一些实验来剖析...博文来自:UWA—简单优化,优化简单!

  一、Shader与ShaderVariants着色器(Shader)是在GPU上执行的小程序,通常情况下,我们自己写的一个着色器文件(xxx.shader)对应一个着色器变体,对应一个GPU程序。但如...博文来自:的博客

  16.5减少需要处理的顶点数目尽管drawcall是一个重要的性能指标,但顶点数目同样有可能成为GPU的性能瓶颈。16.5.1优化几何体3D游戏制作通常后是模型制作开始的。而在建模时,有一条规则我们需...博文来自:wy小骑士

  有一段时间没有写东西了,主要是一些工作上的事情在缠人,脱不开呢,闲话就不多说了,继续开始新的篇章.在上一篇中已经知道,这样的灯光效果是在PS中由模糊+图层叠加形成的.那么在我们的shader图形渲染中...博文来自:如同神临的博客

  基础知识介绍什么是ShaderVariant在写shader时,往往会在shader中定义多个宏,并在shader代码中控制开启宏或关闭宏时物体的渲染过程。最终编译的时候也是根据这些不同的宏来编译生成...博文来自:爱打游戏的肥宅猿

  本文转自:先放结论:if和for确实有效率问题(相比CPU下的情况),但是通常情况无法回避,也就无需处理。 用step代替...博文来自:萧戈的专栏

  一、Shader与ShaderVariants着色器(Shader)是在GPU上执行的小程序,通常情况下,我们自己写的一个着色器文件(xxx.shader)对应一个着色器变体,对应一个GPU程序。但如...博文来自:的博客

  关于Unity5.xLightmapShader编译过慢的分析缘起最近在研究Unity5.x的Lightmapping与场景打包的相关的知识。发现坑深啊。关于怎么打包怎么用网上的教程太多了,就不再鳌述...博文来自:variyous的博客

  项目需要,角色进入草丛要半透明。已用了untiy自带shader(StandardSpecular)的Fade模式。 用代码电脑上调试没问题,结果上了真机就无法半透明。原因是unity打包时只会打sh...博文来自:zhenmu的专栏

  原本项目是Unity4.6版本的,升级到Unity5之后发现原本的雾不再看见了,然后查了一下相关资料,发现官方是改变了雾的渲染。这里有相关的官方方式:博文来自:lihandsome的专栏

  UnityShader:深度图获取,屏幕后期处理特效中学习了如何使用unityshader处理摄像机画面,这次来看看多重渲染的使用。有时候我们想同时获得一个画面的不同后期效果:比如需要同时显示深度图,...博文来自:键盘春秋的博客

  上一篇博客讲了MRT多重渲染,这篇接着学习通过一个shader输出不同效果的另一种方法——指定不同的渲染通道。渲染通道在unityShader中就是SubShader中的Pass。之前的shader中...博文来自:键盘春秋的博客

  1过量的shader会使得加载速度变慢 --处理方法 批量处理 合并这些shader 放在一个脚本中 但是只有在使用相同的渲染状态下才可以在subshader中的pass过多也会影响渲染的性能,应该当...博文来自:huhudeni的博客

  版本:unity5.4.1 语言:UnityShader 总起:今天使用Shader的时候遇到了问题,知道是哪边错了,却不知道怎么改,书又放到家里了,最后还是查到解决的代码,但是这类东西还是记录下来比...博文来自:暗光之痕的博客

  存在这里主要是为了方便查找:引用了别人的总结:一、内置包含文件Unity中有类似于C++的包含文件.cginc,在编写Shader时我们可以使用#include指令把这些文件包含进来这样我们就可以...博文来自:y90o08u28的博客

  漫画效果shader       这个shader主要分为四个部分:灯光阴影,阴影斜线,描边和高光  灯光阴影这部分和unity的卡通材质类似,准备一张阴影分布图,将灯光方向和法线方向的点积作为贴图的...博文来自:宫文佳的博客

  在Unity3D中,shader是何时编译的,在何时加载入显存中的?是某一对象在实例化时,加载其相关的material与shader还是游戏开始时?添加评论 分享按时间排序按投票排序4个回答赞同9反对...博文来自:痞子龙3D编程

  一、Unity5中新的Shader体系简析 Unity5和之前的书写模式有了一定的改变。Unity5时代的ShaderReference官方文档也进一步地变得丰满。 主要需要了解到的是,在原来的Uni...博文来自:起个名字好难啊

  概要:本文对Unity5中全新的三种Shader模板的源码进行了解析,然后还讲解了运动模糊屏幕特效的实现方法。Unity5和之前的书写模式有了一定的改变。Unity5时代的ShaderReferenc...博文来自:【浅墨的游戏编程Blog】毛星云(浅墨)的专栏

  Shader山下(二十)编译指令(CompilationDirectives)介绍了如何使用编译指令,本文就专文介绍一下多重编译(multi_compile)指令。我们可以使用multi_compil...博文来自:凯奥斯的注释

  最近又是一阵瞎忙,至于忙啥,忙工作,忙生活,然后现在想想有感觉是一瞬间的事情,好像只是过往云烟,吹之即散.突然感觉做人真的应该学会留下点什么,哪怕是毫无意义的东西呢.那么接着说,这次是学习多Pass的...博文来自:如同神临的博客

  上篇文章中我们掌握了表面剔除和剪裁模式这篇文章将利用这些知识实现一个简单的,但是又很常用的例子:把一张图片做成圆角矩形例3:圆角矩形Shader好吧我承认在做这个例子的时候走了不少弯路,由于本人对矩阵...博文来自:墨半成霜的博客

  一、介绍        在2维平面地图上随机或者指定位置生成一系列的热量、能源或者其他需要表示的信息的分布图。可以通过切换不同的贴图表示不同的信息,如图所示表示的是该地区的降水量的变化如图所示为表示该...博文来自:Just do IT(就是喜欢干IT)

  1、我们一般把资源和代码作为两个工程。资源工程导出assetbundle供代码工程使用。这么做主要是防止资源过多导致代码工程启动速度慢,影响开发效率。2、尽量避免使用Resources文件夹。这个文件...博文来自:langresser的专栏

  动态调用的shader必须放在resource文件夹下,否则打包后会出现问题。博文来自:GT黑喵的博客

  笔者介绍:姜雪伟,IT公司技术合伙人,IT高级讲师,CSDN社区专家,特邀编辑,畅销书作者,已出版书籍:《手把手教你架构3D游戏引擎》电子工业出版社和《Unity3D实战核心技术详解》电子工业出版社等...博文来自:海洋个人博客

  说明:今天尝试使用Shader制作一个播放序列帧的功能,主要的思想是逐帧修改图片的UV坐标。测试图片:(1)用于测试播放顺序,以免出现顺序问题(2)真实测试使用的图片Shader代码如下所示Shade...博文来自:大爷就是胖喵喵(转载联系)

  默认情况下,我们编写的Shader都只对模型的正面进行渲染,因为大多数模型都是封闭的,我们看不到反面。在实际的开发过程中,也经常会遇到需要正反面都渲染的时候,比如开发手游的时候经常需要用一个面片+透明...博文来自:dbtxdxy的专栏

  作者用cpu做了个。改了个shader版本的。效果:中间的残影是gi...博文来自:三林博客

  效果1:Edge+Bloom(边缘高光)使用菲涅尔边缘效果,配置局部Bloom,实现边缘高光效果效果2:outline+stencil+bloom(轮廓背光)思路:第一步获取边缘,使用的屏幕处理,使用...博文来自:Benny Shader

  IAP升级功能编写初期的一些困惑与疑问---完成功能后的总结 一,网上下载的例程,跳转部分的代码有差异,尤其是用的汇编那句 二,关于跳转部分的代码的理解(转) 三,关于跳转时能否不用按键,用软件标志位...博文来自:Super_Demo的专栏

  现在的Win7系统中安装的一般都是32位的Office,因为微软推荐使用32位的Office,兼容性更强,稳定性更好。在使用Access作为数据库的时候,C#操作Access,如果Access是acc...博文来自:写代码的蜗牛

  转载请注明出处:     在上一篇blog中介绍过POI检索的使用,本篇blog主要介绍公交信息检索和线路规划的内容。 公交信息检索     实际上,公交信息检索与POI检索、在线建议检索非常相似,也...

  Java中的ThreadLocal类允许我们创建只能被同一个线程读写的变量。因此,如果一段代码含有一个ThreadLocal变量的引用,即使两个线程同时执行这段代码,它们也无法访问到对方的Thread...

  u011860731的专栏C#实现开发windows服务实现自动从FTP服务器下载文件(自行设置分/时执行)

  最近在做一个每天定点从FTP自动下载节目.xml并更新到数据库的功能。首先想到用 FileSystemWatcher来监控下载到某个目录中的文件是否发生改变,如果改变就执行相应的操作,然后用timer...

  摘要 最近要发论文了,被知乎里人推荐使用论文编译软件(CTex、LaTex和Overleaf之类),瞬间感觉自己用Word简直Out了(书读少)。 学校里也听说过LaTex,不过因为当时没怎么写过...

  看到很多朋友配置vsftpd时不能使用匿名用户上传和下载(创建目录或删除、重命名文件夹),本文主要解决vsftpd的匿名用户权限配制问题。...

  一个例子高斯混合模型(Gaussian Mixed Model)指的是多个高斯分布函数的线性组合,理论上GMM可以拟合出任意类型的分布,通常用于解决同一集合下的数据包含多个不同的分布的情况(或者是同一...

  最近比较有空,大四出来实习几个月了,作为实习狗的我,被叫去研究Docker了,汗汗! Docker的三大核心概念:镜像、容器、仓库 镜像:类似虚拟机的镜像、用俗话说就是安装文件。 容器:类似一个轻量...

  我走小路的博客将Excel文件导入数据库(POI+Excel+MySQL+jsp页面导入)第一次优化

  本篇文章是根据我的上篇博客,给出的改进版,由于时间有限,仅做了一个简单的优化。相关文章:将excel导入数据库2018年4月1日,新增下载地址链接:点击打开源码下载地址十分抱歉,这个链接地址没有在这篇...

  Http协议的重要性相信不用我多说了,HttpClient相比传统JDK自带的URLConnection,增加了易用性和灵活性(具体区别,日后我们再讨论),它不仅是客户端发送Http请求变得容易,而且...

  klkxxy的博客三菱FX系列PLC与PC通讯的实现之专有协议(计算机联接)的程序设计之一

  阅读内容为:FX系列微型可编程控制器用户手册(通讯篇)中计算机链接功能章节。 采用本方法通信,pc端的实现,其实就是,把操作按照协议(2种)翻译成相应的字符串,通过串口发送给plc。 编写一应用程...

  强连通分量: 简言之 就是找环(每条边只走一次,两两可达) 孤立的一个点也是一个连通分量   使用tarjan算法 在嵌套的多个环中优先得到最大环( 最小环就是每个孤立点)   定义: int Ti...

  u013268685的专栏(有一种幸福叫AC,有一种期待叫AK)简单linux字符设备驱动程序与编程小技巧(上)

  这几天开始研究linux下的驱动程序编写了,遇到的问题也挺多的,好在linux是开源的,很多高人编写的技巧和思路都会在他们的源代码中体现,我也在他们的源码中学到了很多好东西,我归纳了下贴出来,希望自己...

  苹果充值的刷单现象在游戏行业非常普遍,很多团队挖空心思寻找漏洞以非法获利。常见的手段主要有以下六种: 伪造充值凭据(receipt)以小额凭据骗取大额商品 凭据重复使用 凭据重复使用信用卡黑卡/...

  分享知识、分享进步jquery/js实现一个网页同时调用多个倒计时(最新的)

  jquery/js实现一个网页同时调用多个倒计时(最新的) 最近需要网页添加多个倒计时. 查阅网络,基本上都是千遍一律的不好用. 自己按需写了个.希望对大家有用. 有用请赞一个哦! //js ...

  一、代理模式为某个对象提供一个代理,从而控制这个代理的访问。代理类和委托类具有共同的父类或父接口,这样在任何使用委托类对象的地方都可以使用代理类对象替代。代理类负责请求的预处理、过滤、将请求分配给委托...

  如下图所示,蜂窝小区,以1为中心,顺时针编号,编号最大限定为100000。求任意两编号之间的最短距离。两个相邻小区的距离为1 示例:19到30的最短距离为5 实现如下三个接口: /**********...

  NYS001的专栏魔兽争霸3冰封王座1.24e 多开联机补丁 信息发布与收集点

  在MATLAB中,可以注释一段程序。 使用“%{”和“%}”。 例如 %{ 。。。 %} 即可。 经典方法是用 if 0,但缺点是不够直观,注释掉的内容仍然保持代码的颜色。现在可以用 ...

http://disyu.com/tongdaominglingzi/369.html
锟斤拷锟斤拷锟斤拷QQ微锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷微锟斤拷
关于我们|联系我们|版权声明|网站地图|
Copyright © 2002-2019 现金彩票 版权所有