最近加入一家公司,开始让我学习做特效,我一脸懵逼,不会啊!浅薄的理解了一下粒子系统又开始学习Shader 的编写。在没了解之前还以为Shader会和C#一样,上手简单,但是到直到现在,还没理解Shader的逻辑。老天了,送我一个大佬吧!
经过最近的学习,整理了以下自己对Shader编写的认知,都比较浅薄,有错误希望大佬及时指出。
就写一下自己整理的Shader的框架吧。
*1. 名字(自己命名)
2. 属性 Properties{}
2.1
属性名字由一个下划线开始,括号中的第一个参数,是属性显示在材质面板上的名字。第二个参数,是数据类型。
**
2.2 _MainTex
_MainTex(“Base(RGB)”,2D)=“white” {}–(变量名(显示名,类型)=默认值)
2.3
不同类型的属性:
2D-2D贴图
Color-颜色
Float-浮点数
Range()-带范围的浮点数
Cube-CubeMap天空盒
Rect-非2的幂次方纹理
Vevtor-四维向量
3. SubShader
3.1 SubShader
SubShader{ //标签,可选 [Tags] //状态,可选 [RenderSetup] Pass{} //Other Passes }
3.2 标签
3.2.1 "Queue"标签,定义渲染顺序。
预制值为:
1.“BackGround”: 值1000。比如用于天空盒
2.“Geometry”:值为2000。大部分物体在这个队列。不透明的物体也在这里。
3.“AlphaTest”:值为2450。已进行AlphaTest的物体在这个队列。
4.“Transparent”:值为3000。透明物体。
5.“Overlay”:值为4000。比如镜头光晕。
6.用户可以定义任意值,比如"Queue"="Geometry+10"
3.2.2 "RenderType"标签。Unity可以运行时替换符合特定RenderType的所有Shader
Camera.RenderWithShader或者Camera.SetReplacementShader配合使用。
1.“Opaque”:绝大部分不透明的物体都使用这个;
2.“Transparent”:绝大部分透明的物体、包括粒子特效都使用这个;
3.“Background”:天空盒都使用这个;
4.“Overlay”:GUI、镜头光晕都使用这个;
5.还有其他可参考Rendering with Replaced Shaders;用户也可以定义任意自己的RenderType字符串。
3.2.3
“ForceNoShadowCasting”,值为"true"时,表示不接受阴影。
3.2.4
“IgnoreProjector”,值为”true”时,表示不接受Projector组件的投影。
3.2.5
"LIghtMode"指定Pass和Unity的哪一种渲染路径(“Rendering Path”)搭配使用。
ForwardBase :向前渲染
ForwardAdd
Always :永远都渲染,但不光照处理
ShadowCaster,用于渲染产生阴影的物体。
ShadowCollector,用于收集物体阴影到屏幕坐标Buff里。
3.3
LOD级别(默认时是200)
VertexLit及其系列 = 100
Decal,Reflective VertexLit = 150
Diffuse = 200
Diffuse Detail
Reflective Bumped Unlit
Reflective Bumped VertexLit = 250
Bumped, Specular = 300
Bumped Specular = 400
Parallax = 500
Parallax Specular = 600
4.Pass中一般写以下代码
4.1
Color Color 设定对象的纯颜色,可以是括号中的四个值,也可以是被方框包围的颜色属性名称
4.2
Material{Material Block} 材质被用于定义对象的材质属性,关于材质块的内容可以看下面的介绍
4.3
Lighting On/Off 定义上述材质块的定义是否有效,On时材质块效果有效,Off时颜色通过Color命令直接给出
4.4
SeparateSpecular On/Off 开启独立镜面反射,这个命令会添加高光光照到着色器通道的末尾,因此贴图对高光没有影响。只在光照开启时有效。
4.5
ColorMaterial AmbientAndDiffuse | Emission
使用每顶点的颜色替代材质中的颜色集。AmbientAndDiffuse 替代材质的阴影光和漫反射值;Emission 替代 材质中的光发射值。
5
定义着色器
5.1
fixed function shader (固定功能着色器)
5.2
vertex and fragment shader (顶点片段程序着色器)
5.3
surface shader (表面着色器)
6.
6.1定义变量
sampler2D :图片类型
Shader中的数据类型。数据类型的精度够用就好。颜色和单位向量,使用fixed;其他情况,尽量使用half;否则才使用float。
float :32位高精度浮点数。
half :16位中精度浮点数。范围是[-6万, +6万],能精确到十进制的小数点后3.3位。
fixed :11位低精度浮点数。范围是[-2, 2],精度是1/256。
saturate :是指 饱和处理,大于1就变成1,小于0就变成0
6.2. 定义结构体
7. 光照计算
Material{Materila Block} 这个模块控制了顶点光照的信息,包括漫反射、高光、环境光等
Diffuse : Color 默认颜色组件,基本颜色
Ambient : Color 环境颜色组件,物体在被RenderSettings里面设置的环境光照射时的颜色
Specular : Color 高光反射颜色
Shininess : Number 高光的锐利度,在0到1之间,0时高光巨大,1时高光尖锐。
Emission : Color 自发光,当物体没有被任何光线照射时的颜色。
最终颜色:Ambient * RenderSettings ambient setting +(Light Color * Diffuse + Light Color * Specular) + Emission
8. 片元着色器
9.
9.1
Lighting On/Off 控制顶点光照开关
9.2
Cull Back/Front/Off 控制剔除的面
9.3
ZTest(Less/Greater/LEqual/GEqual/Equal/NotEqual/Always)
深度测试模式,小于、大于、小于等于、大于等于、等于、不等于、一直时,才显示。
9.4
ZWrite On/Off
深度写入的开关
9.5
Fog{Fog Block} 这个模块可以给物体单独设置雾的效果。
9.6
AlphaTest (Less | Greater | LEqual | GEqual | Equal | NotEqual | Always) CutoffValue
透明度测试,小于、大于、小于等于、大于等于、等于、不等于某值时显示
9.7
Blend SourceBlendMode DestBlendMode
设置混合模式。
9.8
Color Color value
当Light off时设置颜色
9.9
ColorMask RGB | A | 0 | any combination of R, G, B, A
过滤颜色,如果参数是RGB的一种或几种时,将过滤参数的颜色,如果是0,将过滤所以颜色
9.10
Offset OffsetFactor , OffsetUnits
设置Z缓存深度偏移
9.11
SeparateSpecular On | Off
控制顶点光照的高光开关,如果开了,那么在物体最终颜色基础上再加上高光颜色
9.12
ColorMaterial AmbientAndDiffuse | Emission
使用材质颜色代替环境光、漫反射或者自发光
10.
回滚 FallBack Shader基本框架的最后是指定一个回滚函数Fallback,用来处理所有的子着色器都不能运行时的情况
~~肯定有错误的地方,希望大佬路过能提醒一下,不要让我一个萌新走上弯路。~~
7万+



被折叠的 条评论
为什么被折叠?



