您好、欢迎来到现金彩票网!
当前位置:秒速牛牛开奖 > 通道命令字 >

Unity Shader - Making multiple shader program variants 制作s

发布时间:2019-06-25 09: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—简单优化,优化简单!

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

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

  有一段时间没有写东西了,主要是一些工作上的事情在缠人,脱不开呢,闲话就不多说了,继续开始新的篇章.在上一篇中已经知道,这样的灯光效果是在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的专栏

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

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

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

  版本: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时代的ShaderReferenc...博文来自:【浅墨的游戏编程Blog】毛星云(浅墨)的专栏

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

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

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

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

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

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

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

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

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

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

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

  原文:一、前言之前有个案例讲到了Unity&Shader案例篇—绘制雨滴,没有看过的童鞋可以在回去看看,这一篇其实思...博文来自:阿童木的博客

  一、前言最近在开发一个关卡类的游戏,在导入一些3D物体的时候,发现很多时候同一个3D物体需要渲染的方式不一样,比如这颗树要双面渲染(CullOff),但在很多情况下是可以剔除背面(CullBack...博文来自:yinfourever的专栏

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

  最近学习ShaderForge制作了水流效果,记录下来以便日后使用,也方便大家参考:大致意思是通过时间去分别改变U或者V从而影响Texture的效果,水流由“水”的图片以及“波光”图片组成,有UV影响...博文来自:weixin_40019413的博客

  最近很多人问,如何将内网的摄像机流媒体数据发布到公网,如果用公网与局域网间的端口映射方式太过麻烦,一个摄像机要做一组映射,而且不是每一个局域网都是有固定ip地址,即使外网主机配置好了每一个摄像机的映射...博文来自:Babosa的专栏

  一、图像内插-最近邻内插法 1、数学原理      当一幅二维数字图像从源图像N*M被放为(j*N) * (k*M)目标图像是,参照数学斜率计算公式      必然有: (X1 – Xmin)/...博文来自:清风似水流的专栏

  帐号相关流程注册范围 企业 政府 媒体 其他组织换句话讲就是不让个人开发者注册。 :)填写企业信息不能使用和之前的公众号账户相同的邮箱,也就是说小程序是和微信公众号一个层级的。填写公司机构信息,对公账...博文来自:小雨同学的技术博客

  本文介绍了如何在超图桌面平台通过倾斜摄影模型提取DSM、DOM数据。博文来自:SuperMap技术控

  LCD RGB 控制技术讲解 — 时钟篇(上)个人笔记,欢迎转载,请注明出处,共同分享 共同进步 博文来自:人有三样东西是无法隐瞒的,咳嗽,穷困和爱,你想隐瞒越欲盖弥彰

  mybatis简单的CURD就不用多说了,网上相关博客文档一大堆。分析一下Mybatis里面的collection聚集查询。 假设一个班级有多名学生为例,通过班级号查询出该班级的信息,和班级里面的所...博文来自:minpann的博客

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