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着色,不使用光照
- ShadowGun之Shader分析
- shader之——shadowGun代码分析
- ShadowGun shader 解析(1)
- shadowgun
- AngryBot之Shader分析
- cocos2dx shader分析之CCGLProgram
- cocos2dx shader分析之CCGLProgram
- ShadowGun 暗影之枪 项目源码,手机优化示例关卡
- shader 分析
- ShadowGun Shaders
- ShadowGun代码
- 【Unity Shaders】ShadowGun系列之二——雾和体积光
- 【Unity Shaders】ShadowGun系列之二——雾和体积光
- Unity3D之Shader:Shader介绍
- Unity Shader 之Geometry Shader
- WOW地形Shader分析
- 【Shader】 脚本结构分析
- shader 算法 分析
- 手机百度借势母亲节 移动互联网时代需注重情感营销
- 天气两极分化
- 自定义UISlider
- 将十进制小数转化为二进制小数
- leetcode第一刷_Text Justification
- ShadowGun之Shader分析
- ZTree 实现 单选和复选组合
- Android Unable to execute dex: java.nio.BufferOverflowException.解决办法
- Longest Substring Without Repeating Characters
- 自定义UISegmentedControl
- .NET压缩与解压控件Xceed Zip for .NET控件详细介绍使用方法及下载
- 境外电商人才培训基地在温大成立
- canvas元素
- 二十四种模式