全球的csgo着色缓存器器缓存文件:程序文件(80)蒸汽Steamapps / _试验机/全球shadercac

UnityShaderVariant的一些探究心得
  最近遇到了一个问题,角色在Unity编辑器里运行渲染结果都是好的,打包到IOS上却发现,角色身上渲染的很黑.花了些时间查了查,又试了试,把这方面算是初步弄清楚了。
  先说出现问题的原因,由于我们把shader打包进了AssetBundle中,并且在Shader中使用了shader_feature来定义了宏。
  为了完整起见,先从unity的shader
variant说起。
ShaderVariant
  举个例子,对于一个支持法线贴图的Shader来说,用户肯定希望无论是否为Shader提供法线贴图这个Shader都能正确的进行渲染处理。一般有两种方法来保证这种需求:
  1.在底层shader(GLSL,HLSL等)定义一个由外部传进来的变量(如int),有没有提供法线贴图由外部来判断并给这个shader传参,若是有则传0,否则传1,在Shader用if对这个变量进行判断,然后在两个分支中进行对应的处理。
  2.对底层shader封装,如Unity的ShaderLab就是这种,然后在上层为用户提供定义宏的功能,并决定宏在被定义和未被定义下如何处理。最终编译时,根据上层的宏定义,根据不同的组合编译出多套底层shader.
  上述两种方法,各有利弊,对于前者由于引入了条件判断,会影响最终shader在GPU上的执行效率。而后者则会导致生成的shader源码(或二进制文件)变大。Unity采取的是后者,我们这里也只讨论Unity对后者的使用。
  Unity的Shader中通过multi_compile和shader_feature来定义宏(keyword)。最终编译的时候也是根据这些宏来编译成多种组合形式的Shader源码。其中每一种组合就是这个Uniy Shader的一个Variant。
Material与ShaderVariant的关系
  一个Material同一时刻只能对应它所使用的Shader的一个variant。进行切换的要使用Material.EnableKeyword()和Material.DisableKeyword()来开关对应的宏,然后Unity会根据你设定的组合来匹配响应的shader variant进行渲染。如果你是在编辑器非运行模式下进行的修改那么这些keyword的设置会被保存到材质的.mat文件中,尝试用NotePad++打开.mat文件,你应该会看到类似于下面的一段内容(需要在编辑器设置里把AssetSerializationMode设置为Force
1 %YAML 1.1
3 %TAG !u! tag:unity3d.com,2011:
5 --- !u!21 &2100000
7 Material:
serializedVersion: 6
m_ObjectHideFlags: 0
m_PrefabParentObject: {fileID: 0}
m_PrefabInternal: {fileID: 0}
m_Name: New Material
m_Shader: {fileID: 4800000, guid: 3e0be7fac8c0b7cc842a4, type: 3}
m_ShaderKeywords: _B
m_LightmapFlags: 1
m_CustomRenderQueue: -1
  其中的m_ShaderKeywords就保存了这个材质球使用了哪些宏(keyword).
  如果你手头有built-in Shader的源码可以打开里面的StandardShaderGUI.cs看一下Unity自己事怎么处理对于StandardShader的keyword设置的。
  另外Shader.EnableKeyword,和Shader.DisableKeyword是对Shader进行全局宏设置的,这里不提了。
multi_compile和shader_feature的区别
  完全没接触过它们的同学可以先看官方文档的介绍,multi_compile是一直都有的,shader_feature是后来的unity版本中加入的。
举例介绍一下multi_compile和shader_feature:
1.如果你在shader中添加了
1 #pragma multi_compile
2 #pragma multi_compile
  那么无论这些宏是否真的被用到,你的shader都会被Unity编译成四个variant,分别包含了_A _C,_A _D, _B _C,_B _D四种keyword组合的代码
1 #pragma shader_feature _A _B
2 #pragma shader_feature _C _D
  那么你的shader只会保留生成被用到的keyword组合的variant,至于如何判定被用到了一会提到Assetbundle时候会说。
ShaderVariant与Assetbundle的关系
  我所遇到的问题正是和Assetbundle(简称AB)有关,原因是打成AB包之后shader_feature所定义的宏没有被包含进去。
  上面说了multi_compile定义的keyword是一定能正确的生成对应的多种组合的shaderVariant,但shader_feature不尽然,Unity引入shader_feature就是为了避免multi_compile那种完整编译所导致的冗余的没有被使用的shader_variant被生成。shader_feature判断相应的keyword组合是否被使用。需要区分一下几种情况:
  1.如果shader没有与使用它的材质打在一个AB中,那么shader_feature的所有宏相关的代码都不会被包含进AB包中(有一种例外,就是当shader_feature _A这种形式的时候是可以的),这个shader最终被程序从AB包中拿出来使用也会是错误的(粉红色).
  2.把shader和使用它的材质放到一个AB包中,但是材质中没有保存任何的keyword信息(你再编辑器中也是这种情况),shader_feature会默认的把第一个keyword也就是上面的_A和_C(即每个shader_feature的第一个)作为你的选择。而不会把_A _D,_B _C,_B _D这三种组合的代码编译到AB包中。
  3.把shader和使用它的材质放到一个AB包中,并且材质保存了keyword信息(_A _C)为例,那么这个AB包就只包含_A _C的shaderVariant.
  可以看到shader_feature所定义的keyword产生的ShaderVariant并不是全部被打包到AB中,特别是你想在游戏运行时动态的通过EnableKeyWorld函数来进行动态修改材质使用的shaderVariant,如果一开始就没有把对于variant放进AB包,自然也就找不到。
ShaderVariantCollection
  要正确的让各种variant正确的在游戏运行时正确处理,
最直接暴力的两种方法:
1.把Shader放到在ProjectSetting-&Graphics-&Always Include Shaders列表里,Unity就会编译所有的组合变种。
2.把Shader放到Resources文件夹下,也会正确处理,我猜也应该是全部keyword组合都编译,有知道的同学,麻烦留言告诉我。
  但是这两种情况最大的问题就是组合爆炸的问题,如果keyword比较少还好,要是多了那真是不得了,比如你把standardShader放进去,由于它有大量的keyword,全部变种都生成的话大概有几百兆。另外一个问题就是这种办法没法热更新。自然不如放到AB包里的好控制。
  放到AB包就又涉及到shader_feature的处理,为了在运行时动态切换材质的shadervariant,可以在工程里新建一堆材质,然后把每个材质设置成一种想要的keyword组合,把他们和shader放到一起打到一个AB中去,这样虽然能让shadervariant正确生成,但是这些Material是完全多余的。
  为了解决这种问题,Unity5.0以后引入了ShaderVariantCollection(下面简称SVC),这里不讲用法,只说问题,这个SVC文件可以让我指定某个shader要编译都要编译带有哪些keyword的变种。并且在ProjectSetting-&Graphics界面新加了一个Preloaded Shaders列表,可以让你把SVC文件放进去,编译时指定的Shader就会按照SVC中的设置进行正确的variant生成,而不会像Always
Include Shaders列表中的那样全部变种都生成。
  但是它在AB中的表现可就不尽如人意了,要让它起作用,就必须把它和对应的shader放在一个AB中,而且除了5.6以外版本,我试了几个都不能正确使用,不是一个variant都没生成,就是只生成一个shadervariant(和放一个没有设置keyword的材质效果一样).你可以自己用UnityStudio打开查看一下生成的AB内容。
  应该正确的理解Unity提供multi_compile和shader_feature以及ShaderVariantCollection的意图,根据自己的情况来选择合理的解决方案。
  在查这个问题的过程中也google了一些,发现国外在这方面的讨论远没国内多,应该是因为老外很少使用热更新这种东西,也自然很少用AB。
  尊重他人智慧成果,若要转载,请注明作者esfog,原文地址http://www.cnblogs.com/Esfog/p/Shader_Variant.html
没有更多推荐了,
加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!一个游戏程序员的自我修养
D3D9 Shader实例教程
啥是Shader?
Shader是一段运行在GPU上的小程序,是运行在GPU上的Pipeline上的特定的可编程单元的小程序。
从D3D9 API层面学习Shader编程
随着Unity3D的流行,很多同学会把Unity ShaderLab和Shader这两个概念搞混。 ShaderLab是Unity引擎中的Shader系统的名称,它完成的是组织Shader、渲染状态、渲染Pass,以及参数绑定等功能,有点像D3D SDK提供的D3D Effect。
如果想系统的学习Shader,就需要从图形API的Pipeline开始。当然,现在理想的是去学习D3D 12,Valukan,Metal这样的新一代API,至少也是D3D 11这样的成熟API,或者Open GL ES,如果你专供移动端图形的话。
下面这套代码,是我在2008年的时候,基于D3D9 API写的一组教程代码,因为最近有同学问起,所以找出来重新发布。
代码已经上传到GitHub:
D3D9 Shader教程文档
实现基本光照
程序的基本思路
class SimpleD3DApp处理了win32窗口创建和D3D初始化的工作,然后响应菜单,生成相应的ShaderSimpler派生类实例。
一个个ShaderSimpler的派生类为一个shader试验小程序。
Effect的基本处理步骤
编辑一个纯文本文件,推荐后缀为fx. shader\SimpleDraw.fx是一个使用vertex shader和pixel shader的最简单的Effect文件:
使用D3DXCreateEffectFromFile函数加载生成一个ID3DXEffect对象;另外也可以使用fxc命令行工具把上述文本文件编译成二进制文件。
在渲染前调用ID3DXEffect::SetMatrix()设置effect中的参数;
使用ID3DXEffect::Begin(),BeginPass(),EndPass(),End()来控制渲染流程。
实现一个简单omni灯光的计算
对于每个顶点进行灯光计算;
光照公式使用”距离衰减*(N.L)”;
Wolfgang Engel, Implementing Lighting Models With HLSL:
ATI, FixedFuncShader –
Phong shading
这个小程序通过把顶点法线逐象素插值,再计算每个象素的diffuse,specular光照结果来简单的实现phong模型。因为specular是view depended,所以Effect中增加了eyePos参数。
通过观察box的渲染可以看出与basic lighting的明显不同。
这段小程序没有考虑性能的问题,为了提升速度,可以ps中的L,V,R放到vs中去计算。
镜头操作:WS前后,AD左右,ZX上下移动,鼠标拖动为转动。
卡通渲染主要包括两个效果:
1. 把普通光照的平滑亮度变化变成几个强度级别。这是通过计算出光照强调,然后查找一个贴图来实现的,此贴图存储0~1的4个固定段。
2. 描出轮廓线。法线与视线垂直的点为轮廓,所以使用两者的点积结果来查找一个贴图,然后乘以光照颜色来实现描边,此贴图0附近为全黑,其余为全摆。
Keith Lee, Cartoon Rendering with HLSL,
DX9SDK simple, BasicHLSL
Cube Map环境映射特别适合与曲面,实现也很简单--构造一个视点到顶点的向量,然后计算出相对与normal的反射向量,用此向量索引cube map贴图即可。
顺便比较了一下shpere环境映射的效果。Sphere环境映射的实现也很简单,把顶点法向量变换到view space,然后使用贴图坐标(n.x/2+0.5,n.y/2+0.5)来索引sphere map贴图即可。
DX9SDK simple, HLSL workshop, Goal 3
Bump Mapping(Normal mapping)
从贴图生成normal map
normal map可以从一个颜色贴图对应的高度图生成。为了计算i,j点的normal,首先可以根据高度差计算出s,t方向的切向量:
S(i,j) = &1, 0, aH(i+1,j)-aH(i-1,j)&
T(i,j) = &0, 1, aH(i,j+1)-aH(i,j-1)&
其中a是一个缩放系数。normal可以由这两个切向量得出
*N(i,j) = normalize(cross(S,T)) = cross(S,T)/length(cross(S,T)) = &-Sz, -Tz, 1& / sqrt(Sz^2 + Tz^2 +1)
然后可以把这个向量使用RGB编码存储到贴图文件中。原理是这样,本例使用nvidia提供的工具生成normal map。
计算出Tangent space
这个计算稍微有些复杂。记得老早的时候nvidia有一个文档写的很清楚,不过我怎么也搜不出来了。哪位要是知道,请给我个链接。在Eric Lengyel的书里面找到了另外一种解法,讲得也很透彻。
本例子中简单的调用了D3DXComputeTangent,也可以使用nvidia sdk中提供的nv_meshmender来计算。
使用Bump map的光照计算与前面的PhongShading例子相比没有什么新鲜的。前面的例子中每个象素的normal只是简单的从顶点normal插值而来,而使用bump map后,每个顶点的normal可以从贴图中查找;另外因为这个normal是存在与tangent space中,所以需要把light dir和view dir都转换到tangent space再进行计算。
Eric Lengyel, 3D游戏与计算机图形学中的数学方法
Normal Map贴图使用nVidia Photoshop plugin生成 –
Wolfgang Engel, Implementing Lighting Models With HLSL –
Parallax Mapping
Parallax map通过简单的计算可以大幅提高per-pixel光照的效果。Parallax map的想法基于一个简单的事实,那就是当我们用一个多边形去表现一个凹凸不平的表面的时候,事实上随着视线的变化,看到的实际的texel并不是顶点uv坐标差值出来的那个结果,而是有一定的偏移。而这个偏移可以通过是个高度图来计算。
在本例中,经过简化,最后单个象素uv偏移量的公式为:
offset = &viewDir.x, viewDir.y&*(height*SCALE+BIAS)
其中的height就是高度图在这个uv的高度值,然后根据实际需要进行缩放和偏移。SCALE和BIAS可以根据所要渲染的物体的单位来估计,例如要渲染一个1平方米的砖墙,那么我们估计每个砖的起伏在几厘米。在本例中使用这个offset将uv进行偏移之后,再去采样bump map和color map。
程序运行时按字母键“P”可以打开、关闭parallax map,用来比较效果。:)
Terry Welsh, Parallax Mapping, ShaderX3 p89
实现类似魔兽世界的“全屏泛光”
现在很多游戏,像WOW、激战都有这种“全屏泛光”的画面效果,很多人以为是使用了HDR,其实就是一个post process效果。
PostProcess是一个很简单又有用的概念,顾名思义,就是把渲染之后的场景,在图像空间进行一些处理。它可以做出各种各样的效果。
全屏泛光的实现步骤如下
分配三个texture,F,A,B,其中F的大小与back buffer一致,A和B为back buffer面积的四分之一;
将场景渲染到F;
将F渲染到A - 执行down sample和high-pass filter;
将A渲染到B - 执行H blur;
将B渲染到A - 执行V blur,先横向再纵向计算,把每个象素需要的计算由n*n变为n+n,其中n为blur区域的大小;
将F和A混合,渲染到back buffer,然后present。至于混合的公式,就可以自己发挥了。:)
nVidia FXComposer
初探Deferred shading
对于一个基于Shader的渲染系统如何来计算多个动态光源的光照呢?这是一个困扰我很久的问题。基本上有这样三种解决方案:
1. 在单个pass中计算物体的所有光照。这种方案的主要缺点就是shader管理非常复杂。常见的思路是基于一套shader模版,自动生成n个光照shader,n往往能达到上百个;另外一个主要的缺点就是很多fragment经过复杂的光照计算之后又被z测试剔除,造成计算的浪费(可以先进行一个z only pass来优化);
2. 为每个灯光进行一个pass。这种方案也会有前者over draw的问题,另外还会造成draw call数量增加;
3. deferred shading,这种方案结构简单,但是对显卡要求较高,需要multi-render targets, float point render target;还有就是对于透明面,目前还没有很好的解决方法。
下面就介绍一下Deferred Shading的思路。它的想法非常的简单、直接,简单的说就是我们可以把光照计算需要的一些参数先通过一个pass渲染到一些render target中(称为Attributes buffer或G-Buffer),然后可以为每个灯光进行一个pass来计算光照。
源码中演示了deferred shading的基本概念,实现了4个点光源的phong 光照渲染。为了能在Geforce 5600上跑,没有使用multi-render targets,而是用了多个pass来生成G-Buffer,这样也可以更清楚的演示deferred shading的概念。
首先程序创建了position,normal,diffuse三个render target,在渲染时使用3个pass,把场景的“世界坐标”,“法线(世界坐标系)”,“颜色”,分别渲染到这三个render target中;为了简单起见,假设所有灯光都覆盖整个屏幕――为每个灯光进行一个pass,渲染一个全屏幕的quad,然后为每个象素计算光照,并使用additive混合,把光照强度累加到屏幕缓冲中。
Deferred shading with Multiple Render Targets
今天抽空是试验了一下使用MRT进行deferred shading。基本是在上个例子的基础上修改的,主要有一下几个地方:
- 使用SetRenderTarget分别将各个render target设置好;
- 在pixel shader中使用“COLOR[n]”来写入各个render target;
- 有一点需要注意的是,MRT的各个surface的bits必须是一致的,所以这个例子使用了两个G16R16的float - texture来保存position。
OK,就是这样简单。渲染效果与上个例子一样。这个例子程序在geforce 7600GT上测试通过,其他显卡没测过。
没有更多推荐了,
加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!打开绝地求生就这样怎么解决_百度知道
打开绝地求生就这样怎么解决
全局着色器缓存文件'E:/新建文件夹绝地
/steamapps/c om mon/PUBG/Engi ne/GlobalShaderCache-PCD3D_M4.in丢
您的应用程序进行编译来加载已烘培的内容。但是没有找到已烘培的内容;这通常意
味着 您没有为该版本烘培 内容。
这也可能预示着丢失了着色...
我有更好的答案
验证游戏完整性试试打开steam,右键单击游戏,选择属性,点击本地文件,点击验证游戏完整性
采纳率:80%
还是不行啊!
1条折叠回答
为您推荐:
其他类似问题
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。学无止境,三人行必有我师,把这几年收藏的文章都晒出来,大家共享吧!向原创者致敬!察而知不足,严谨,求真,务实;网络收藏夹...
用fxc.exe编译shader文件(*.fx, *.hlsl)的设置
原文出自:
拿DX11 SDK中BasicCompute11为例子
右击BasicCompute11.hlsl -& properities -& Custom Build Tool -& command line: "$(DXSDK_DIR)Utilities\bin\x86\"fxc.exe
/T cs_5_0 /E CSMain /Fo "%(Filename).cso" "%(FullPath)" -& outputs: $(filename).cso
根据shader类型和入口函数名的不同,红色字体部分可做相应的替换。
例如对于fx文件,可设置为:
"$(DXSDK_DIR)Utilities\bin\x86\"fxc.exe
/T fx_4_0 /Fo "%(Filename).fxo" "%(FullPath)"
$(filename).fxo
原文出自:
拿DX11 SDK中BasicCompute11为例子
右击BasicCompute11.hlsl -& properities -& Custom Build Tool -& command line: "$(DXSDK_DIR)Utilities\bin\x86\"fxc.exe
/T cs_5_0 /E CSMain /Fo "%(Filename).cso" "%(FullPath)" -& outputs: $(filename).cso
根据shader类型和入口函数名的不同,红色字体部分可做相应的替换。
例如对于fx文件,可设置为:
"$(DXSDK_DIR)Utilities\bin\x86\"fxc.exe
/T fx_4_0 /Fo "%(Filename).fxo" "%(FullPath)"
$(filename).fxo
没有更多推荐了,
加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!

我要回帖

更多关于 缓存安装程序文件 的文章

 

随机推荐