1.模板
Shader “ShaderName”{
Properties{
}
SubShader{
}
Fallback “VertexLit”
}
2.Properties语句块
属性类型 | 默认值的定义语法 | 例子 |
---|---|---|
Int | number | _Int("Int",Int)=2 |
Float | number | _Float("Float",Float)=1.5 |
Range(min,max) | number | _Range("Range",Range(0.0,5.0))=3.0 |
Color | (number,number,number,number) | _Color("Color",Color)=(1,1,1,1) |
Vector | (number,number,number,number) | _Vector("Vector",Vector)=(2,3,6,1) |
2D | "defaultTexture" {} | _2D("2D",2D)="" {} |
Cube | "defaultTexture" {} | _Cube("Cube",Cube)="white" {} |
3D | "defaultTexture" {} | _3D("3D",3D)="black" {} |
3.SubShader 语义块
子着色器
SubShader{
[Tag]
[RenderSetup]
Pass{
}
}
状态名称 | 设置指令 | 解释 |
---|---|---|
Cull | Cull Back |Front|Off | 是指剔除模式,剔除背面/正面/关闭剔除 |
ZTest | ZTest Less Greater|LEqual|GEqual|Equal|NotEqual|Always | 设置深度测试时使用的函数 |
ZWrite | ZWrite On|Off | 开启/关闭深度写入 |
Blend | Blend SrcFactor DstFactor | 开启并设置混合模式 |
在SubShader上设置时,会应用到所有Pass
SubShader的标签类型
标签类型 | 说明 | 例子 |
---|---|---|
Queue | 控制渲染顺序,指定该物体属于哪一个渲染队列,通过这种方式可以保证所有的透明物体可以在所有不透明物体后面被渲染,我们也可以自定义使用的渲染队列来控制物体的渲染顺序 | Tas{“Queue”=“Transparent”} |
RenderType | 对着色器进行分类,例如这是一个不透明的着色器或是一个透明的着色器等,这可以被用于着色器替换功能。 | Tags{“RenderType”=“Opaque”} |
DisableBatching | 一些SubShader在使用Unity的批处理功能时会出现问题,例如使用了模型空间下的坐标进行顶点动画。这时可以通过该标签来直接指明是否该SubShader使用批处理 | Tags{“DisableBatching”=“True”} |
ForceNoShadowCasting | 控制使用该SubShader的物体是否会投射阴影 | Tags{“ForceNoShadowCasting”=“true”} |
IgnoreProjector | 如果该标签为“true”,那么使用该SubShader的物体将不会受Projector的影响,通常用于半透明物体 | Tags{“IgnoreProjector”=“true”} |
CanUseSpriteAtlas | 当该SubShader是用于精灵(Sprite)时,该标签设为“False” | Tags{“CanUseSpriteAtlas”=“False”} |
PreviewType | 指明材质面板将如何预览该材质,默认情况下,材质将显示为一个球形,我们可以通过将该标签的值设为“Plane”“SkyBox”来改变预览类型 | Tags{“PreviewType”=“Plane”} |
Level of Detail (LOD),用来定义不同的性能的显卡所对应的子着色器
4.Pass语义块
Pass{
[Name]
[Tags]
[RenderSetup]
//Other code
}
标签类型 | 说明 | 例子 |
---|---|---|
LightMode | 定义该Pass在Unity的渲染流水线中的角色 | Tags{“LightMode”=“ForwardBase”} |
RequireOptions | 用于指定当满足某些条件时才渲染该Pass,它的值是一个由空格分隔的字符串。目前,Unity支持的选项有:SoftVegetation | Tags{“RequireOptions”=“SoftVegetation”} |
5.头文件
文件名 | 描述 |
UnityCG.cginc | 包含了最常使用的帮助函数、宏和结构体等 |
UnityShaderVariables.cginc | 在编译UnityShader时,会被自动包进来,包含了许多内置的全局变量,例如UNITY_MATRIX_MVP |
Lighting.cginc | 包含了各种内置的光照模型,如果编写的是SurfaceShader会自动打包进来 |
HLSLSurport.cginc | 在编译UnityShader时,会被自动包含进来,声明了许多的用于跨平台编译的宏和定义 |
UnityCG.cginc中常用的结构体
名称 | 描述 | 包含的变量 |
appdata_base | 可用于顶点着色器的输入 | 顶点位置、顶点法线、第一组纹理坐标 |
appdata_tan | 可用于顶点着色器的输入 | 顶点位置、顶点切线、顶点法线、第一组纹理坐标 |
appdata_full | 可用于顶点着色器的输入 | 顶点位置、顶点切线、顶点法线、四组(或更多)纹理坐标 |
appdata_img | 可用于顶点着色器的输入 | 顶点位置、第一组纹理坐标 |
v2f_img | 可用于顶点着色器的输出 | 裁剪空间中的位置、纹理坐标 |
UnityCG.cginc中常用的帮助函数
函数名 | 描述 |
float3 WorldSpaceViewDir(float4 v) | 输入一个模型空间中的顶点位置,返回世界空间中从该点到摄像机的观察方向 |
float3 ObjSpaceViewDir(float4 v) | 输入一个模型空间中的顶点位置,返回模型空间中从该点到摄像机的观察方向 |
float3 WorldSpaceLightDir(float4 v) | 仅可用于前向渲染中。输入一个模型空间中的顶点位置,返回世界空间中从该点到光源的光照方向,没有被归一化 |
float3 ObjSpaceLightDir(float4 v) | 仅可用于前向渲染中。输入一个模型空间中的顶点位置,返回模型空间中从该点到光源的光照方向,没有被归一化 |
float3 UnityObjectToWorldNormal(float3 norm) | 把法线方向从模型空间转换到世界空间中 |
float3 UnityObjectToWorldDir(in float3 dir) | 把方向矢量从模型空间变换到世界空间中 |
float3 WorldToUnityObjectDir(in float3 dir) | 把方向矢量从世界空间变换到模型空间中 |
6.Unity提供的CG/HLSL语义
从应用阶段传递模型数据给顶点着色器时Unity支持的常用语义
语义 | 描述 |
POSTITION | 模型空间中的顶点位置,通常是float4类型 |
NORMAL | 顶点法线,通常是float3类型 |
TANGENT | 顶点切线,通常是float4类型 |
TEXCOORDn,如 TEXCOORD0、TEXCOORD1 | 该顶点的纹理坐标,TEXCOORD0表示第一组纹理坐标,依次类推。通常是float2或float4类型 |
COLOR | 顶点颜色,通常是fixed4或float4类型 |
从顶点着色器传递数据给片元着色器时Unity使用的常用语义
语义 | 描述 |
SV_POSITION | 裁剪空间中的顶点坐标,结构体中必须包含一个用该语义修饰的变量,等同于DirectX9中的POSITION,但最好使用SV_POSITION |
COLOR0 | 通常用于输出第一组顶点颜色,但不是必须的 |
COLOR1 | 通常用于输出第二组顶点颜色,但不是必须的 |
TEXCOORD0~TEXCOORD7 | 通常用于输出纹理坐标,但不是必需的 |
片元着色器输出时Unity支持的常用语义
语义 | 描述 |
SV_Target | 输出值将会存储到渲染目标中,等同于DirectX9中的COLOR语义,但最好使用SV_Target |
7.数据精度
类型 | 精度 |
float | 最高精度的浮点值。通常使用32位来存储 |
half | 中等精度的浮点值。通常使用16位来存储,精度范围是-60000~+60000 |
fixed | 最低精度的浮点值。通常使用11位来存储,精度范围是-2.0~+2.0 |
5.
CGPROGRAM 开始CG代码
ENDCG 结束CG代码
#pragma 标注东西 例如片段着色器使用哪个方法、使用的是哪个着色模型版本