ShadowGun之Shader分析

来源:互联网 发布:百度云老是网络异常 编辑:程序博客网 时间:2024/05/01 22:46

MadFinger在Unity上的Blog:

http://blogs.unity3d.com/2012/03/23/shadowgun-optimizing-for-mobile-sample-level/


官方提供的场景中一共有20个shader,有如下特点:

1. 不使用任何动态的光照计算,而是在光照图的基础上加入效果;

2. 一些原本需要在pixel shader中实时计算的效果,要放在vetexshader中运算,并且复杂运算尽量采用纹理查询的方式;

3. 擅用顶点颜色:一方面可以携带一些计算需要的数据(比如柔体计算的权重),另外也可以放入顶点alpha值之类。

4. 要使用尽量多的shader加速指令(如ARB_precision_hint_fastest)

 

 

角色

位置:Mobile/BRDFLit(Supports Backlight,Shadowgun style Light Probes)

类型:surface shader

光照模型:自定义(PseudoBRDF)

编译选项:#pragma surface surf PseudoBRDF exclude_path:prepassvertex:separateSH nolightmap noforwardadd noambient approxview

(不为延迟管线生成pass;使用顶点修正函数;不使用光照图;只支持一个方向光的像素运算;不使用环境光和light prob运算;在顶点shader中计算出视点方向)

这些选项的设置,都是为了让shader更小,运行得更快

代码实现:

用LightProbes系统插值得到的光照值作为遮蔽和环境光值(OcclusionAndAmbientLight);然后用一张BRDF贴图,使用查询的方式来模拟明暗和高光效果。可以得到比较好的效果和很高的效率。

 

场景(地板和墙壁等需要高光的静态模型)

位置:  MADFINGER/Environment/Virtual Gloss Per-VertexAdditive(Supports Lightmap)

类型:vertex and fragment programs

代码实现:

基本上就是典型的顶点高光算法,但灯光的位置是假的,可以由美术指定,典型的值就是摄像机的位置。

 

场景(一些动态模型)

位置:  MADFINGER/Environment/Lightprobeswith VirtualGloss Per-Vertex Additive

类型:vertex and fragment programs

代码实现:

和上面的一样,只是使用Lightprobes的光照替代了亮度图。

 

场景(不需要高光的模型)

位置:MADFINGER/Environment/Unlit(Supports Lightmap)

类型:fixedfunction

代码实现:

和diffuse是一样的,直接使用lightmap

 

场景(需要反射环境的模型,如金属表面)

位置:MADFINGER/Environment/Cube env map (Supports Lightmap)

类型:vertex and fragment programs

代码实现:

就是一般的立方体反射效果,只是增加光照图的支持(unity3自带的没有?)

 

特效(模拟静态的光线效果)

位置:MADFINGER/Transparent/GodRays

类型:vertex and fragment programs

代码实现:

实现一个在[近距离,远距离]范围内,大小和颜色正常显示,而在这个范围外会缩小,并且颜色会减淡的半透明混合特效。

这个场景中只是用于窗户上射进的灯关特效。模型使用了顶点颜色,而且顶点法向量也是做过修改,实现得很有技巧性。

 

 

特效(模拟动态变换的关晕效果)

位置:MADFINGER/Transparent/Blinking GodRays

类型:vertex and fragment programs

代码实现:

基本就是上GodRays的扩展版本,支持了颜色按时间变化

 

特效(模拟动态变换的光晕效果,公告板模式)

位置:MADFINGER/Transparent/Blinking GodRays Billboarded

类型:vertex and fragment programs

代码实现:

就是在动态GodRays上增加了billboard模式,使用到了顶点颜色去标记一些数据,好像计算挺复杂的,找机会再看。

 

特效(毒气罐)

位置:MADFINGER/Environment/Scroll 2 Layers Multiplicative No Lightmap Sine

类型:vertex and fragment programs

代码实现:

两层贴图,做不同频率和速度的贴图移动动画

 

特效(烟雾)

位置:MADFINGER/Environment/Scroll 2 Layers Sine AlphaBlended

类型:vertex and fragment programs

代码实现:

和“Scroll 2 Layers Multiplicative No Lightmap Sine”是一样的算法,但支持的是普通的alpha混合(没有加亮效果)

 

天空盒(地面)

位置:MADFINGER/Environment/Skybox - opaque - no fog

类型: fixed function

代码实现:

关闭雾化和光照的简单shader,在所有的不透明几何体之后渲染

 

天空盒(山峰、天空中远处的星球等)

位置:MADFINGER/Environment/Skybox - transparent - no fog

类型: fixed function

代码实现:

关闭雾化和光照的简单shader,为半透明效果,在所有的半透明几何体之前渲染

 

 

天空盒(天空)

位置:MADFINGER/Environment/Scroll 2 Layers Multiplicative - Skybox

类型:vertex and fragment programs

代码实现:

贴图可以移动,也是在所有的不透明几何体之后渲染

 

水面

位置:MADFINGER/FX/Anim texture

类型:vertex and fragment programs

代码实现:

带有颜色变化和贴图移动来模拟简单的水波动画

 

物理效果(旗帜、绳索等)

位置: MADFINGER/Environment/Lightmap + Wind

类型:vertex and fragment programs

代码实现:

模拟风吹柔体的动画

 

武器(角色拿的枪械)

位置:MADFINGER/Environment/weapon

类型:vertex and fragment programs

代码实现:

使用LightProbes的顶点高光算法

 

 

最简单的着色(窗户)

位置:  MADFINGER/Diffuse/Simple

类型:Fixed function

代码实现: 

最简单的diffuse着色,不使用光照

0 0