什么是着色器?
着色器Shader —— 运行在图形处理单元(GPU)上的程序,可以对图形硬件的渲染功能进行设置。
Unity 使用 ShaderLab 着色语言,同时支持使用 Cg、HLSL、GLSL 编写的着色器程序。
Shader "name"
{
[Properties]
SubShader { } //可以有多个,unity会找到第一个被用户机器支持的子着色器
[Fallback] //如果没有子着色器被支持,那么会尝试使用指定的降级着色器
}
对应的变量类型 ——
颜色、向量、4个数、3个数的转换
属性类型 | 变量类型 |
---|---|
Range、Float | float(32位)、half(16位)、fixed(11位) |
Int | |
Color、Vector | float4、half4、fixed4 |
2D | sampler2D |
Rect | |
Cube | samplerCube |
3D | sampler3D |
类型 | 说明 |
---|---|
变量名(”属性面板显示名”,变量类型) = 默认值 | 属性通过变量名name来访问,通常以下划线开头 |
数值类型 | |
name(“display name”, Range(min,max)) = num | 定义一个浮点数范围 |
name(“display name”,Float) = num | 定义一个浮点数 |
name(“display name”,Int) = num | 定义一个整数 |
颜色与向量 | |
name(“display name”, Color) = (num,num,num,num) | 定义颜色属性,num取值范围 0~1 |
name(“display name”,Vector) = (num,num,num,num) | 定义四维向量属性 |
纹理类型 | |
name(“display name”,2D) = “name” { options } | 定义2D纹理,缺省值为”white”“black”“gray”“bump” |
name(“display name”,Rect) = “name” { options } | 定义矩形纹理(尺寸非2次方),缺省值同上 |
name(“display name”,Cube) = “name” { options } | 定义立方图纹理,缺省值同上 |
name(“display name”,3D) = “name”{ options } | 定义3D纹理 |
纹理属性的 options 选项是可选的,具体咋用的还是没太明白(貌似不是太常见)
选项名称 | 说明 |
---|---|
TexGen | 纹理生成模式,纹理自动生成纹理坐标时的模式。可以是 TexGen ObjectLinear、TexGen EyeLinear、TexGen SphereMap、TexGen CubeReflect、TexGen CubeNormal,这些模式和OpenGL纹理生成模式相对应。 注意:如果使用自定义的顶点、片段着色器,那么纹理生成模式将被忽略 |
LightmapMod | 光照贴图模式,如果给出这个选项,纹理会被渲染器的光线贴图所影响,即纹理不能被应用在材质中,而是使用渲染器中的设定 |
使得开发者能针对不同性能的显卡编写不同的着色器程序。
一个着色器可以包含一个 SubShader 列表,unity运行时 会根据实际的运行环境,在列表中从上到下选出第一个被用户显卡支持的 SubShader 来呈现效果。
SubShader //注意两个 S 都是大写
{
[Tags] //标签
[CommonState] //通用状态,可以为所有的通道初始化所需的通用状态
Pass //通道列表,有些效果不能通过单个通道就完成,那就必须使用多次通道
{
[Name and Tags]
[RenderSetup]
[TextureSetup]
}
}
定义通道的类型有 Pass、UsePass、GrabPass
SubShader 使用的标签 —— 告诉unity引擎或其他用户,如何认证这个 SubShader |
---|
Tags{ "标签1"="值1" "标签2"="值2" } //键值对,多个之间用的是空格
SubShader 的标签 | 说明 |
---|---|
Queue | 决定对象被渲染的次序 Background(1000)、Geometry默认值(2000)、AlphaTest(2450)、Transparent(3000)、Overlay(4000)、(具体看308页) |
RenderType | 渲染类型,可以用于着色器替换功能(shader replacement) |
DisableBatching | 禁用批处理,可选值 True、False、LODFading |
ForceNoShadowCasting | 强制不投射阴影,如果为True,由该子着色器渲染的对象不会投射阴影 |
IgnoreProjecttor | 忽略投影,例如不想在半透明物体上显示其他物体的阴影 |
CanUseSpriteAtlas | 如果该着色器用于精灵对象上,如果设置为False,那么打包图集之后,着色器不起作用 |
PreviewType | 材质属性面板上预览窗口显示的类型,默认材质球,也可以是 Plane、Skybox |
Pass 的标签 | 说明 |
---|---|
LightMode | 定义该Pass在 Unity 的渲染流水线中的角色 Tags{“LightMode” = “ForwardBase”} |
RequireOptions | 用于指定当满足某些条件时才渲染该Pass,它的值是一个由空格分隔的字符串。 unity目前支持的选项有 SoftVegatation Tags{ “RequireOptions” = “SoftVegatation” } |
SubShader 包装了一个渲染方案,而这个方案是由一个个通道(Pass)来执行的。
SubShader 可以包括多个Pass块,每个Pass能使几何对象被渲染一次。
Pass
{
[Name and Tags]
[RenderSetup] //渲染设置命令,设置显卡的各种状态
[TextureSetup] //纹理设置命令
}
特殊的通道 | 语法 | 说明 |
---|---|---|
UsePass | UsePass “Shader/Name” | |
GrabPass | GrabPass{ [“纹理名”] } |
通道渲染设置命令 | 含义 | 说明 |
---|---|---|
Lighting | 光照 | 开启或关闭顶点光照,On、Off |
Material{ 材质块 } | 材质 | 定义一个顶点光照管线的材质 |
ColorMaterial | 颜色集 | 当计算顶点光照时使用的顶点颜色,颜色集可以是 AmbientAndDiffuse、Emission |
SeparateSpecular | 高光开关状态 | 开启或关闭顶点光照相关的镜面高光颜色,开关状态 On、Off |
Color | 颜色 | 设置顶点光照关闭时,使用的颜色 |
Fog {雾块} | 雾 | 设置雾参数 |
重点 | ||
AlphaTest | Alpha 测试 | 默认值 LEqual,可选值 Less、Greater、LEqual、GEqual、Equal、NotEqual、Alwalys |
ZTest | 深度测试模式 | Less、Greater、LEqual、GEqual、Equal、NotEqual、Always |
ZWrite | 深度写模式 | On、Off |
Blend | 混合模式 | SourceBlendMode、DestBlendMode、AlphaSourceBlendMode、AlphaDestBlendMode |
ColorMask | 颜色遮罩 | 颜色值可以是 RGB 或 A 或 0 或任何 R\G\B\A 的组合,设置0可以关闭所有颜色通道的渲染 |
Offset | 深度偏移因子 | 设置深度偏移,这个命令只接受常数参数 |
Cull | 裁剪模式 | 设置裁剪模式,可以是 Back、Front、Off |
如果没有任何 SubShader 能被运行在当前的硬件上,那么尝试使用降级着色器
常见用法 |
---|
Fallback “着色器名” |
Fallback Off |
前面所说的渲染设置是在 SubShader 或是在 Pass 中指定的。
Category 分类,是渲染命令的逻辑组,大多数情况下,用于继承渲染状态。(只影响着色器的解析,不影响执行速度)
例如,可以有多个子着色器,它们都需要关闭雾效、设置混合等。
Shader "Example"
{
Category
{
Fog{ Mode Off }
Blend One One
SubShader{ }
SubShader{ }
}
}