Unity着色器常用关键字及属性

看了好多次shader,不过还是感觉无从下手的去写shader,然后看shader的效果

个人认为还是因为shader基础打得不够扎实,顾特意再重温shader相关书籍的时候,看见有些常用关键字时,把他记录下来

希望这对学习unity shader的同学来说有些用


Shader
  • 这是shader的根命令
SubShader
  • 这个是子着色器,一个Shader里面可以有多个SubShader
Properties
  • 属性块

常用属性
语法 说明
name(“display name”,Range(min,max)=number) 定义一个范围值
name(“display name”,Color=(number,number,number,number) 定义颜色,number取0~1
name(“display name”,2D)=”name”{option} 定义2D纹理,缺省值:”white”,”black”,”gray”,”bump”
name(“display name”,Rect)=”name”{option} 定义矩形纹理(非2的n次幂),缺省值为2D纹理属性
name(“display name”,Cube)=”name”{option} 定义立方体纹理,缺省值同位2D纹理
name(“display name”,Float)=number 定义一个浮点数
name(“display name”,Vector)=(number,number,number,number) 定义四维向量


纹理属性选项(即2D等属性的{option})
选项名称 说明
TexGen 自动生成纹理坐标时的模式,可以为:ObjectLiner、EyeLinear、SphereMap、CubeMap、CubeNormal
LightmapMode 光照贴图模式,如果给出这个选项,纹理会被渲染器的光线贴图所影响,即纹理不能被应用在材质中,而是使用渲染器中的设定

Tags
  • Queue 队列标签

Tags {“Queue”=”Transparent”}

队列名称 说明
Background 后台,这个渲染队列在所有渲染队列之前渲染,被用于天空盒之类的对象(1000)
Geometry 几何体,这个是默认队列,被用于大多数对象,不透明的几何体使用这个队列(2000)
Transparent 透明,在几何体队列之后渲染,采用由后到前的次序,任何采用alpha混合的对象(不对深度缓冲产生写操作的着色器)应该在这里渲染(如玻璃,粒子等)(3000)
Overlay 覆盖,这个渲染队列用于实现叠加效果,任何需要最后渲染的对象应该放置在此处(如镜头光晕)(4000)

  • IgnoreProjector 忽略投影标签
Pass
  • 每个通道都能使几何体被渲染一次,一个Subshader里面可以有多个Pass

两个特殊通道

通道名称 语法 说明
UsePass UsePass “Shader/Name” 插入所有来自给定着色器中的给定名字的通道,Shader为着色器的名字,Name是通道的名字
GrabPass GrabPass{[“纹理名”]} 捕获屏幕到一个纹理,该纹理通常使用在靠后的通道中,”纹理名”是可选的

UsePass例子:
UsePass “Specular/BASE”
Name “MyPassName”
使用Specular/BASE这个Pass,并在当前shader中重命名为MyPassName使用
所有通道名字都是大写开头,因此UsePass必须使用大写开头的名字来书写索引

GrabPass捕获当前屏幕内容到一个纹理中,纹理能在后续通道中通过_GrabTexture进行访问


通道渲染设置命令

命令 说明
Material{材质块} 定义一个使用顶点光照管线的材质
Lighting 开关状态 开启或关闭顶点光照。开关状态值为On或Off
Cull 裁剪模式 设置裁剪模式,裁剪模式有Back、Front、Off
ZTest 测试模式 设置深度测试模式。测试模式有Less、Greater、LEqual、GEqual、Equal、NotEqual、Always
ZWrite 开关状态 开启或关闭深度缓冲,开关值为On或Off
Fog{雾块} 设置雾参数
AlphaTest 测试模式< alpha测试值 > 开启alpha测试,测试模式有Less、Greater、LEqual、GEqual、Equal、NotEqual、Always
Blend 混合模式 设置alpha混合模式,混合模式有SourceBlendMode、DestBlendMode
Color <颜色> 设置当顶点光照关闭时使用的颜色
ColorMask 颜色值 设置颜色遮罩,颜色值可以使用RGB或A或0或任何R、G、B、A的组合,设置为0将关闭所有颜色通道的渲染
Offset 偏移因子,偏移单位 设置深度偏移,这个命令仅接受常数参数
SeparateSpecular 开关状态 开启或关闭顶点光照相关的镜面高光颜色。开关状态的值为On或Off
ColorMaterial 颜色集 当计算顶点光照时使用顶点颜色,颜色集可以是AmbientAndDiffuse,也可以是Emission

SetTexture
  • 设置纹理,格式为SetTexture [纹理属性名] {纹理块}

混合
  • 混合是用来制作透明物体的

    常用混合只能在RGBA模式下进行,物体的绘制顺序会影响到OpenGL的混合处理

    Blend常用语法如下:
    • Blend Off
    • 关闭混合
    • Blend 源因子 目标因子
    • 配置并开启混合,计算产生的颜色和源因子相乘,颜色缓冲中的颜色和目标因子相乘,然后两个颜色相加
    • Blend 源因子 目标因子,源因子A 目标因子A
    • 源因子,目标因子和上面相同,但是源因子A,目标因子A这些因子使用alpha通道进行混合
    • BlendOp 操作
    • 不是将加入的颜色混合在一起,而是对他们做一些操作,主要操作指令有Min(最小值)、Max(最大值)、Sub(求和)、RevSub

关于混合因子

OpenGL红宝书上的解释为:

源因子:就是当前的贴图,或光照计算后生成的颜色值

目标因子:就是显示器中的帧缓存的图

常用混合因子(对源因子和目标因子都有效)如下:

混合因子 说明
One 值为1,使用此设置来让源或是目标颜色完全地通过
Zero 值为0,使用此设置来删除源或目标值
SrcColor 此阶段的值是乘以源颜色的值
SrcAlpha 此阶段的值是乘以源alpha的值
DstColor 此阶段的值是乘以帧缓冲区目标颜色的值
DstAlpha 此阶段的值是乘以帧缓冲区目标alpha的值
OneMinusSrcColor 此阶段的值是乘以(1-源颜色)
OneMinusSrcAlpha 此阶段的值是乘以(1-源alpha)
OneMinusDstColor 此阶段的值是乘以(1-目标颜色)
OneMinusDstAlpha 此阶段的值是乘以(1-目标alpha)



以下是常见的混合类型:

  • Blend SrcAlpha OneMinusSrcAlpha //混合
  • Blend One One //混合相加
  • Blend One OneMinusDstColor //柔和相加混合
  • Blend DstColor Zero //相乘混合
  • Blend DstColor SrcColor //2倍相乘混合

通道标签

通道标签只能在通道(而不是子着色器)中使用

  • LightMode
    • 光照模式标签,它定义了光照管线中的通道的角色。比较少用,大多数情况下需要和光照进行互动的着色器会被写成表面着色器

常用光照模式标签表如下:

标签 说明
Always 总是渲染,没有光照应用
ForwardBase 环境光,主要的定向光,顶点/SH光被应用
ForwardAdd 附加的逐像素光照被应用。每个光照1个通道
PrepassBase 渲染法线/镜面指数
PrepassFinal 使用纹理,光照和自发光混合出最终的颜色
Vertex 当物体没有光照映射使用顶点光照渲染,所有顶点光照被应用
VertexLMRGBM 当物体有光照映射时使用顶点光照渲染,在平台上光照映射是RGBM编码
VertexLM 当物体有光照映射时使用顶点光照渲染,在平台上光照映射是double-LDR编码(移动平台,以及老师CPU)
ShadowCaster 将物体当做阴影产生者来渲染
ShadowCollector 为了正向渲染路径将对象的阴影收集到屏幕空间缓冲区中

- RequireOptions
- 当某些额外条件满足时,该通道才会被渲染,它的值是SoftVegetation,需要在Quality Settings中开启SoftVegetation才渲染通道


Fallback
  • 降级,如果没有子着色器能使用,将运行降级着色器,用法如下:
  • Fallback “着色器名” //回归到指定着色器
  • Fallback Off //不降级,也不会出现任何出错报警,没有子着色器也会继续运行
Category
  • 分类是渲染命令的逻辑组,大多数情况下用于继承渲染状态

#pragma surface 表面函数 光照模式 [可选参数]
  • 表面函数
    表明那些CG函数中有表面着色器的代码,这个函数的格式如下:
    void surf(Input IN,inout SurfaceOutpur o)

  • 光照模式
    在光照模式中使用,内置的光照模式有Lamberr(漫反射)和BlinnPhong(高光)

  • 可选参数
    可选参数列表如下:

可选参数 说明
alpha Alpha混合模式,使用它可以写出用以渲染半透明效果的着色器
alphatest:VariableName Alpha测试模式,使用它可以写出镂空效果的着色器。楼口大小的变量(VariableName)是一个float型的变量
vertex:VertexFunction 自定义的顶点函数,VertexFunction为函数名
finalcolor:ColorFunction 自定义的最终颜色函数,ColorFunction为函数名
exclude_path:prepass或exclude_path:forward 使用指定的渲染路径,不需要生成通道
addshadow 添加阴影投射并且集合通道,通常用于自定义顶点的修改,使阴影也能投射在任何过程的顶点动画上
dualforward 在正向(forward)渲染路径中使用双重光照贴图(dual lightmap)
fullforwardsshadows 在正向(forward)渲染路径中支持所有阴影类型
decal:add 添加贴花着色器
decal:blend 混合半透明的贴花着色器
softvegetation 使表面着色器仅能在Soft Vegetation打开时进行渲染
noambient 不使用任何环境光照(ambient lighting)或者球面调和光照(spherical harmonics lights)
novertexlights 在正向渲染(Forward rending)中不使用球面调和光照(spherical harmonics lights)或每顶点光照(per-vertex lights)
nolightmap 在这个着色器上禁用光照贴图(lightmap)
nodirlightmap 在这个着色器上禁用方向光照贴图(directional lightmap)
noworwardadd 禁用正向渲染添加通道,这会使这个着色器支持一个完整的方向光和所有逐顶点/SH计算的光照
approxview 当着色器有需要的时候,计算每个顶点,而不是每个像素的方向,这样更快,但是当摄像机接近表面时,视图方向不完全正确
halfasview 在光照函数中传递进来的是half-direction向量,而不是视图方向向量,Half-direction计算且将每个顶点标准化,这样更快,但不完全正确



标准的表面着色器输出结构体如下:
struct SurfaceOutput {
half3 Albedo; //反射光颜色
half3 Normal; //法线
half3 Emission; //自发光,用于增强物体自身的亮度,使之看起来好像可以自己发光
half Specular; //镜面高光
half Gloss; //光泽度
half Alpha; //透明度
};

表面着色器的输入结构体Input包含着所有着色器所需要的纹理坐标和附加值
纹理坐标必须在纹理名称前面加上”uv”,或者以”uv2”作为头命名来使用第二个纹理坐标集
附加值按需要加入Input中,常用附加值如下所示:

附加值 说明
float3 viewDir 视图方向,为了计算视差、边缘光照等效果,Input需要包含视图方向
float4 with COLOR semantic 每个顶点颜色的插值
float4 screenPos 屏幕空间中的位置,为了获得反射效果,需要包含屏幕坐标
float3 worldPos 世界坐标
float3 worldRefl 世界空间中的反射向量。如果表面着色器不写入法线(o.Normal)参数,将包含这个参数
float3 worldNormal 世界空间中的法线向量。如果表面着色器不写入法线(o.Normal)参数,将包含这个参数
float3 worldRefl;INTERNAL_DATA 内部数据。如果表面着色器写入了o.Normal,将包含世界反射向量。为了得到基于每个像素的法线贴图的反射向量需要使用世界反射向量(WorldReflection(IN,o.Normal))
float3 wroldNormal;INTERNAL_DATA 内部数据。如果表面着色器写入了o.Normal,将包含世界法线向量。为了得到基于每个像素的法线贴图的法线向量需要使用世界反射向量(WorldReflection(IN,o.Normal))

RenderType

在一个子着色器的Tags中可以设置RenderType,格式如:
Tags {“RenderType” = “Opaque”}
而RenderType的参数如下所示:

  • Opaque: 用于大多数着色器(法线着色器、自发光着色器、反射着色器以及地形的着色器)。
  • Transparent:用于半透明着色器(透明着色器、粒子着色器、字体着色器、地形额外通道的着色器)。
  • TransparentCutout: 蒙皮透明着色器(Transparent Cutout,两个通道的植被着色器)。
  • Background: Skybox shaders. 天空盒着色器。
  • Overlay: GUITexture, Halo, Flare shaders. 光晕着色器、闪光着色器。
  • TreeOpaque: terrain engine tree bark. 地形引擎中的树皮。
  • TreeTransparentCutout: terrain engine tree leaves. 地形引擎中的树叶。
  • TreeBillboard: terrain engine billboarded trees. 地形引擎中的广告牌树。
  • Grass: terrain engine grass. 地形引擎中的草。
  • GrassBillboard: terrain engine billboarded grass. 地形引擎何中的广告牌草。

顶点片元着色器

顶点片元着色器不使用灯光交互,实际着色器代码用CG或HLSL语言编写,嵌入在着色器的通道块中,常用编译指令表如下所示:

编译指令 说明
pragma vertex 声明以name为名字的函数是顶点程序
pragma fragment 声明以name为名字的函数是片元程序
pragma fragmentoption 添加选项到编译的OpenGL片元程序,通过OpenGL的ARB_fragment_program可以查询到所允许的规范的选项列表,这个指令对顶点程序或者不是以OpenGL为编译目标的程序无效
pragma target 着色器目标编译
pragma only_renderers 仅用给定的渲染器编译着色器。默认情况下用所有的渲染器都编译着色器。当选择多个渲染器时用空格隔开
pragma exclude_renderers 不用给定的渲染器编译着色器。默认情况下用所有的渲染器都编译着色器。当选择多个渲染器时用空格隔开
pragma glsl 用桌面OpenGL平台编译着色器时,将Cg/HLSL转换成GLSL而不是默认的ARB顶点片元着色器



在only_renderers和exclude_renderers中的渲染器如下:

渲染器 渲染器指令代码
Direct3D 9 d3d9
OpenGL opengl
OpenGL ES 2.0 gles
Xbox 360 xbox360
PlayStation 3 ps3
Flash flash



使用方法:#pragma only_renderers opengl

注意:每个顶点片元着色器必须包含一个顶点程序或者片元程序(或两者兼有),因此需要一个#pragma vertex命令或者#pragma fragment命令(或两者兼有)


顶点结构成员
成员 说明
float4 vertex 顶点位置
float3 normal 顶点法线
float4 texcoord 第一UV坐标
float4 texcoord1 第二UV坐标
float4 tangent 切线向量(用在法线贴图中)
float4 color 每个顶点(per-vertex)颜色

你可能感兴趣的:(Unity3D,unity,着色器,shader)