unity中shader的打包

一、我们项目听说不支持shader热更,所以我就想知道为什么。

  打包的程序员说,shader加入在graphics setting的always included shader里可以大大减少AB,而graphics setting而这个文件是在构建安装包时出现在安装包里的,所有shader有点像生成了“内部依赖ab",这个内部ab我们是得不到的,即更新不出去,即如果加了新shader则这个ab发生了改变,依赖它的旧资源的依赖也发生了改变,但是因为此ab在“壳"里,即不能热更出去,所以所有依赖此内部ab的资源,可能都跪了。简单举个例子:

  此内部ab为A,有个资源B依赖一个shader,所以打包时B里有个引用指向A,现在A发生了改变,但不能热更出去,只热更了B,所以B的依赖就木有了。当然,如果是安装的是整包,A就在里面,B的显示就木有问题。

    注:上面的“内部依赖ab""A"等用ab来描述,其实是胡诌的,只是想借助ab依赖包的思想,便于理解。

二、我要做一下测试验证一下

  因为资料较少,加上官方文档说的也不详细,参考这博文:unity5.x  shader打包AssetBundle总结,自己进行了各种测试,得到如下结论:

  1.内置shader(比如Mobile/Diffuse,Standard等),如果在Graphics Setting设置了,则不打入各个资源的ab中,而打入构建包中(构建包会稍大),如果不设置就打入各个资源的ab中,不打入构建包(构建包较小);

  2.自定义shader,不管在不在Graphics Setting里设置,都打入各个资源的ab中(除非给shader进行setassetbundlename,即打shader ab),在Graphics Setting里则构建包大一些。

  3.Graphics Setting的Always included Shaders只是在打ab时影响内置shader打不打入资源ab,在构建时影响打不打入构建包中。

三、总结

  所以有2种方式处理shader打包:

  1.不打shader ab。把大量使用的内置shader设置到Graphics setting里,其余的比如其他内置shader和自定义shader可以直接打入各个资源ab里;能热更不在graphics setting里的shader,如果只有内置的在graphics setting里面,则所有自定义的shader都能热更,但是,如果热更大量使用的shader,会使得增量包较大;

  2.打shader ab,能热更所有shader,并且增量包不大。把shader都打入一个ab里,那设不设置Graphics Setting呢?按我的理解,不需要,但unity5.x  shader打包AssetBundle总结说:“需要将shader添加到GraphicsSetting-> always included shader设置中,否则shader也会显示粉红”,但文:此文说:“项目把shader单独打包,引用shader的资源会依赖shader资源包,shader并不需要加入Graphics Settings和Resources文件夹,只要保证shader文件命名没有空格,加载时保证被依赖的shader有优先加载,那结果就会是正常的。”,所以我个人觉得后者才是正确的,为什么我不去测试验证?因为我懒啊,因为我在内网写demo,无法真机测试,自然就不靠谱了,况且已经到了这一步了,以后碰到就简单了。

时间: 2024-12-20 19:44:16

unity中shader的打包的相关文章

【浅墨Unity3D Shader编程】之五 圣诞夜篇: Unity中Shader的三种形态对比&混合操作合辑

本系列文章由@浅墨_毛星云 出品,转载请注明出处.  文章链接:http://hpw123.net/a/C__/kongzhitaichengxu/2014/1222/164.html 作者:毛星云(浅墨)    微博:http://weibo.com/u/1723155442 邮箱: [email protected] QQ交流群:330595914 更多文章尽在:http://www.hpw123.net 本文算是固定功能Shader的最后一篇,下一次更新应该就会开始讲解表面Shader,而

一、Unity中Shader的三种基本类型

一.固定功能着色器(Fixed Function Shader) 固定功能着色器为固定功能渲染管线的具体表现.功能较简单兼容比较老的机器 二.表面着色器 存在于Unity3D中由U3D发扬光大的一门技术.Untiy3D为我们把Shader的复杂性包装起来,降低shader的书写门槛,创建了表面着色器 三.顶点着色器和片段着色器 GPU上含有两个组件:可编程顶点处理器和可编程片段处理器,顶点和片段处理器被分离成可编程单元,可编程顶点处理器是一个硬件单元,可以运行顶点程序,而可编程片段处理器则是一个

关于Unity中Shader的使用

在游戏的开发过程中,程序员不太会自己去写shader,因为写起来很麻烦,而且只有Unity会报错,编译器也没有什么提示. 通常是拿别人的shader改一改,当然,程序员还是要能看懂和会一点shader Unity坐标系转换 1: transform.localToWorldMatrix 局部转世界的矩阵;2: transfrom.worldToLocalMatrix 世界坐标转局部坐标矩阵; MultiplyPoint, MultiplyPoint3x4 MultiplayVector 来进行坐

Unity中AB资源打包简单的脚本

脚本应该放在Editor文件夹下 using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEditor; public class BuildAssetBundle { [MenuItem("BuildAB/BuildABToWin64/LZMA(体积小,加载慢)")] private static void BuildABsToWin64_LZMA() { //

【淡墨Unity3D Shader计划】五 圣诞用品: Unity在Shader三种形式的控制&混合操作编译

本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接:http://blog.csdn.net/poem_qianmo/article/details/42060963 作者:毛星云(浅墨)    微博:http://weibo.com/u/1723155442 邮箱: [email protected] 文章开头,先给自己诚求个游戏研发实习的好去处. 浅墨今年1月.明年上半年有近半年的空暇时间可供实习. 近5年游戏编程经验,能够胜任全职的游戏开发工作.仅仅拿实习生的工资(性价比非常高有

关于unity 中使用AssetBundle加载资源,shader偶尔会丢失的问题解决办法

问题描述: 因为项目中要进行热更新设计,所以用unity官方推荐的打包方式assetbundle进行打包,打包好了以后再电脑上运行正常,但是当发布到android上后发现偶尔场景背景会出现空白,多方查找,发现unity存在使用assetbundle加载资源会丢失shader的问题.网上找了一些解决方式,测试可用,分享出来. 方案一:(亲测可用) 第一步,在将用到的Shader加到Editor->Graphics Settings的Shader列表里再进行打包(依赖打包) 第二步,在代码中给sha

【原创翻译】初识Unity中的Compute Shader

一直以来都想试着自己翻译一些东西,现在发现翻译真的很不容易,如果你直接把作者的原文按照英文的思维翻译过来,你会发现中国人读起来很是别扭,但是如果你想完全利用中国人的语言方式来翻译,又怕自己理解的不到位,反而与作者的愿意相悖.所以我想很多时候,国内的译者也是无奈吧,下次再看到译作也会抱着一些感同身受的态度去读.这是我第一次翻译整篇文章,能力有限,望见谅,翻译不好的地方也希望大家指出来. 其实ComputeShader在Unity中出现已经有蛮长的一段时间了,因为自己一直对Shader比较感兴趣,所

解读Unity中的CG编写Shader系列6——不透明度与混合

1.不透明度 当我们要将两个半透的纹理贴图到一个材质球上的时候就遇到混合的问题,由于前面的知识我们已经知道了片段着色器以及后面的环节的主要工作是输出颜色与深度到帧缓存中,所以两个纹理在每个像素上的颜色到底以怎样的形式混合在一起最后输出到帧缓存中是我们现在首要讨论的内容. 1.混合(blending) 上一篇文章中的管道环节中的"逐帧操作"环节中的一项操作就是混合操作,可见混合操作是不可编程的固定功能环节. 在混合操作中,我们将片段着色器中计算出来的颜色称之为 "源颜色&quo

解读Unity中的CG编写Shader系列3——表面剔除与剪裁模式

在上一个样例中,我们得到了由mesh组件传递的信息经过数学转换至合适的颜色区间以颜色的形式着色到物体上. 这篇文章将要在此基础上研究片段的擦除(discarding fragments)和前面剪裁.后面剪裁(front face culling and back face culling)来达到透明效果. 当一个mesh组件的信息被传递后,我们能够通过代码决定哪些部分渲染(render)出来.而哪些部分不要.这个过程就像把那些不要的部分剔除了,我们看不到他.尽管他的mesh信息还在.可是我们的G