一篇Shader看完 Shader 基础语法
/**********
*
* 作者 : Quaye
* 时间 : 2018.05.23
*
* 描述 :
* 一篇 shader 看懂 ShaderLab 基础语法
**/
Shader "Quaye/ShaderStructure"
{
// Properties 语句块属性定义,仅仅是在Unity材质面板中显示这些属性而已
Properties
{
//
// 属性定义 :Name("display name",PropertyType) = DefaultValue
//
//
// 解释 :
// * Name : 在Shader中访问用到的名字,命名规则:下划线开头 _Name
// * "display name" : 在属性面板显示的名称
// * PropertyType : 属性类型
//
// 属性列表:
// |-----------------------------------------------------------------------------------|
// | TYPE | INIT FUNCTION | SAMPLE |
// |-------------------|-----------------------|---------------------------------------|
// | 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 | (num,num,num,num) | _Colort("Color",Color) = (1,1,1,1) |
// |-------------------|-----------------------|---------------------------------------|
// | Vector | (num,num,num,num) | _Vector("Vector",Vector) = (2,3,6,1) |
// |-------------------|-----------------------|---------------------------------------|
// | 2D | "defaulttexture"{} | _2D("2D",2D) = ""{} |
// |-------------------|-----------------------|---------------------------------------|
// | Cube | "defaulttexture"{} | _Cube("Cube",Cube) = "white"{} |
// |-------------------|-----------------------|---------------------------------------|
// | 3D | "defaulttexture"{} | _3D("3D",3D) = "black"{} |
// |-------------------|-----------------------|---------------------------------------|
// 列表解释:
// * "defaulttexture"{}:
// -"defaulttexture":要么是空字符串(""),要么是内置纹理名称("white"、"black"、"gray"、"bump")
// -{} :用于指定纹理属性,例如:TexGen CubeReflect、TexGen CubeNormal来控制固定管线的纹理坐标生成
_Int("Int",Int) = 2
_Float("Float",Float) = 1.5
_Range("Range",Range(0.0,5.0)) = 3.0
_Colort("Color",Color) = (1,1,1,1)
_Vector("Vector",Vector) = (2,3,6,1)
_2D("2D",2D) = ""{}
_Cube("Cube",Cube) = "white"{}
_3D("3D",3D) = "black"{}
}
//
// SubShader{
// 显卡 A 使用的自着色器
// }
// SubShader{
// 显卡 B 使用的自着色器
// }
// 每个Unity Shader 最少要包含一个SabShader,当 Unity 需要加载这个Unity Shader时,Unity会扫描所有的
// SabShader 语义块儿,然后选择一个能够在目标平台上运行的 SubShader,如果不支持的话,Unity 就会使用
// Fallback 语义指定的 Unity Shader.
//
SubShader
{
//
// [Tags] : 告诉 Unity “怎样”、“何时”渲染这个对象
//
// 写法 : Tags{ "TagName1"="Value1" "TagName2"="Value2" }
//
// - Queue : 控制渲染顺序指定该物体属于哪一个渲染队列
// - Background 1000 背景物体
// - Geometry 2000 不透明物体
// - AlphaTest 2450 透明测试物体
// - Transparent 3000 透明物体(从后先前渲染)
// - OverLay 4000 叠加效果层
//
// - RenderType : 对着色器进行分类
//
// - DisableBathcing : 是否对该SubShader使用批处理
//
// - ForceNoShadowCasting: 是否投射阴影
//
// - IgnoreProjector : 如果是“True”那么使用该SubShader的物体不受Projector影响,通常用于半透明物体
//
// - CanUseSpriteAtlas : 当前SubShader是用于Sprites时,将该标签设置为false
//
// - PriviewType : 指名材质面板将如何预览材质
//
//
// [RenderSetup]: 可选的;设置显卡的各种状态
//
// - Cull : 设置剔除模式
//
// - Cull Back | Front | Off 剔除背面/正面/关闭剔除
//
// - ZTest : 设置深度测试时使用的函数
//
// - ZTest Less Greater | LEqual | GEqual | Equal | NotEqual | Always
//
// - ZWrite : 开启/关闭 深度写入
//
// - ZWrite On | Off
//
// - Blend : 开启并设置混合模式,Blend混合等式
//
// - Blend Off : 关闭混合
//
// - Blend SrcFactor DstFactor :
// 开启混合并设置混合因子,源颜色(片元产生的颜色)*SrcFactor,而目标颜色(已经存在
// 于颜色缓存的颜色)*DstFactor,然后把两者相加后在存入颜色缓冲中
//
// - Blend SrcFactor DstFactor,SrcFactorA DstFactorA :
// 和上面几乎一样,只是使用不同的因子来混合透明通道,其中Blend关键词是命令,后面依
// 次是作用于源、目标颜色的混合因子,混合因子的值有如下:
// One : 因子为 1
// Zero : 因子为 0
// SrcColor : 因子为源颜色值
// SrcAlpha : 因子为源颜色透明通度0值(a通道)
// DstColor : 因子为目标颜色值
// DstAlpha : 因子为目标颜色透明通度0值(a通道)
// OneMinusSrcColor: 因子为1-源颜色值
// OneMinusSrcAlpha: 因子为1-源颜色透明通度0值(1-a通道)
// OneMinusDstColor: 因子为1-目标颜色值
// OneMinusDstAlpha: 因子为1-目标颜色透明通度0值(1-a通道)
//
// - BlendOp BlendOperation :
// 并非是把原颜色和目标颜色简单相加后混合,而是使用Blend对它们进行其他操作,支持的
// 混合操作有如下
//
// Add : 混合后
// O_rgb = SrcFactor_rgb * S_rgb + DstFactor_rgb * D_rgb
// O_a = SrcFactor_a * S_a + DstFactor_a * D_a
// Sub :
// O_rgb = SrcFactor_rgb * S_rgb - DstFactor_rgb * D_rgb
// O_a = SrcFactor_a * S_a - DstFactor_a * D_a
// RevSub :
// O_rgb = DstFactor_rgb * D_rgb - SrcFactor_rgb * S_rgb
// O_a = DstFactor_a * D_a - SrcFactor_a * S_a
// Min :
// O_rgba = (min(Sr,Dr),min(Sg,Dg),min(Sb,Db),min(Sa,Da))
// Max :
// O_rgba = (max(Sr,Dr),max(Sg,Dg),max(Sb,Db),max(Sa,Da))
// Other Operation :
// 仅在DirectX 11.1 中支持
//
//
// - 常用混合模式:
//
// 正常(Normal), 即透明度混合
// Blend SrcAlpha OneMinusSrcAlpha
//
// 柔和相加(Soft Additive)
// Blend OneminusDstColor One
//
// 正片叠底(Multiply), 即相乘
// Blend DstColor Zero
//
// 两倍相乘(2 x Multiply)
// Blend DstColor SrcColor
//
// 变暗(Darken)
// BlendOp Min
// Blend One One
//
// 滤色(Scren)
// Blend OneMinusDstColor One
// <=> Blend One OneMinusSrcColor
//
// 线性减淡(Linear Dodge)
// Blend One One
//
//
//
//
// Use Pass : 使用其他UnityShader中的Pass;
// Grab Pass : 负责抓取屏幕并将结果存储在一张纹理中,用于后续Pass处理
//
Pass
{
// [Name]
// [Tags] : Pass的标签,告诉渲染引擎怎样渲染该物体
// - LightMode : 定义该Pass在Unity的渲染流水线中的角色
// - RequireOptions : 用于当满足某些条件时才渲染该Pass
// [RenderSetup]
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
// 支持包含头文件,在Unity中他们的后缀为“.cginc”
#include "UnityCG.cginc"
// CG/HLSL中3种精度的数值类型
// |---------------------------------------------------------------------------
// | TYPE | 精度
// |-----------|---------------------------------------------------------------
// | float | 最高精度浮点数,通常使用 32位 来存储
// |-----------|---------------------------------------------------------------
// | half | 中等精度浮点数,通常使用 16位 来存储,-60000 ~ +60000
// |-----------|---------------------------------------------------------------
// | fixed | 最低精度浮点数,通常使用 11位 来存储,-2.0 ~ +2.0
// |-----------|---------------------------------------------------------------
float4 _Diffuse;
// a : application 应用
// v : vertex shader 顶点着色
struct a2v
{
// Unity支持的常用语义:应用阶段 ---传递模型数据---> 顶点着色器
// |-----------------------------------------------------------------------------------
// | POSITION | 模型空家中的顶点位置,通常是 float4 类型
// |-------------------|---------------------------------------------------------------
// | NORMAL | 顶点法线, 通常时 float3 类型
// |-------------------|---------------------------------------------------------------
// | TANGENT | 顶点切线, 通常时 float4 类型
// |-------------------|---------------------------------------------------------------
// | TEXCOODn | 该顶点的纹理坐标,TEXCOORD0 表示第一组纹理坐标,通常float2/float4
// |-------------------|---------------------------------------------------------------
// | Color | 顶点颜色, 通常时 fixed4/float4 类型
// |-------------------|---------------------------------------------------------------
};
// f : vertex shader 片源着色
struct v2f
{
// Unity支持的常用语义:顶点着色器 ---数据---> 片元着色器
// |-----------------------------------------------------------------------------------
// | SV_POSITION | 剪裁空间中的顶点坐标,结构中必须包含一个用该予以修饰的变量
// | | <=>(等价于)
// | | DirectX9中的 POSITION 但最好使用 SV_POSITION
// |-------------------|---------------------------------------------------------------
// | COLOR0 | 通常用于输出第一组顶点颜色,但不是必要的
// |-------------------|---------------------------------------------------------------
// | COLOR1 | 通常用于输出第二组顶点颜色,但不是必要的
// |-------------------|---------------------------------------------------------------
// | TEXCOORD0~7 | 通常用于输出纹理坐标,但不是必要的
// |-------------------|---------------------------------------------------------------
};
//float4 vert(float4 v:POSITION-输入语义) :SV_POSITION-输出语义
float4 vert(float4 v:POSITION) :SV_POSITION
{
return UnityObjectToClipPos(v);// 等价于 mul(UNITY_MATRIX_MVP,*)
}
float4 frag() : SV_TARGET
{
// Unity支持的常用语义:片元着色器 ---输出---> Unity
// |-----------------------------------------------------------------------------------
// | SV_Target | 输出值将会存储到渲染目标(render target)中。
// | | <=>(等价于)
// | | DirectX9中的 COLOR, 但最好使用 SV_Target
// |-------------------|---------------------------------------------------------------
return fixed4(1.0,1.0,1.0,1.0);
}
ENDCG
}
}
//
// 如果上面所有的 SubShader 在这块显卡上都不能运行,那么就使用最低级的 Shader;
//
Fallback Off // 或者 Fallback "name" : Fallback "VertexLit"
}