Shader "Unlit/001"
{
//属性块
Properties
{
//头文本,创建一个属性标题
[Header(Material Property Drawer Example)]
_Int("Int",Int) = 2
_Float("Float",float) = 1.5
//行距
[Space(50)]
_Range("Range",range(0.0,2.0)) = 1.0
_Color("Color",Color) = (1,1,1,1)
_Vector("Vector",Vector) = (1,4,3,8)
_MainTex("Texture", 2D) = "white" {}
_Cube("Cube",Cube) = "white"{}
_3D("3D",3D) = "black"{}
[Toggle] _Toggle ("Toggle", Int) = 0//勾选
[KeywordEnum(None, Add, Multiply)] _Overlay ("Overlay mode", Float) = 0//下拉
[Enum(UnityEngine.Rendering.BlendMode)] _SrcBlend ("Src Blend Mode", Float) = 1
[Enum(UnityEngine.Rendering.BlendMode)] _DstBlend ("Dst Blend Mode", Float) = 1
[Enum(Off, 0, On, 1)] _ZWrite ("ZWrite", Float) = 0
[Enum(UnityEngine.Rendering.CompareFunction)] _ZTest ("ZTest", Float) = 0
[Enum(UnityEngine.Rendering.CullMode)] _Cull ("Cull Mode", Float) = 1
//模板测试的相关属性
[Enum(UnityEngine.Rendering.CompareFunction)]_StencilComp ("Stencil Comparison", Float) = 8
_Stencil ("Stencil ID", Float) = 0
[Enum(UnityEngine.Rendering.StencilOp)]_StencilOp ("Stencil Operation", Float) = 0
_StencilWriteMask ("Stencil Write Mask", Float) = 255
_StencilReadMask ("Stencil Read Mask", Float) = 255
}
SubShader
{
//标签 可选 key = value
Tags
{
"Queue" = "Transparent"//渲染顺序
/*
Queue渲染队列,用来指定当前shader作用的对象的渲染顺序:
Unity中的几种内置的渲染队列,按照渲染顺序,从先到后进行排序,队列数越小的,越先渲染,队列数越大的,越后渲染。
Background(1000) 最早被渲染的物体的队列。
Geometry (2000) 不透明物体的渲染队列。大多数物体都应该使用该队列进行渲染,也是Unity Shader中默认的渲染队列。
AlphaTest (2450) 有透明通道,需要进行Alpha Test的物体的队列,比在Geomerty中更有效。
Transparent(3000) 半透物体的渲染队列。一般是不写深度的物体,Alpha Blend等的在该队列渲染。
Overlay (4000) 最后被渲染的物体的队列,一般是覆盖效果,比如镜头光晕,屏幕贴片之类的
*/
"RenderType" = "Opaque"//着色器替换功能
/*
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. 地形引擎何中的广告牌草。
这些RenderType的类型名称实际上是一种约定,用来区别这个Shader要渲染的对象
当然你也可以改成自定义的名称,只不过需要自己区别场景中不同渲染对象使用的Shader的RenderType的类型名称不同
也就是说RenderType类型名称使用自定义的名称并不会对该Shader的使用和着色效果产生影响
*/
"DisableBatching" = "True"//是否进行合批
"ForceNoShadowCasting" = "True"//是否投射阴影
"IgnoreProjector" = "True"//受不受Projector的影响,通常用于透明物体
"CanUseSpriteAltas" = "False"//是否用于图片的Shader,通常用于UI
"PreviewType" = "Plane"//用作shader面板预览的类型
}
//模板测试
Stencil
{
Ref [_Stencil]//参考值
ReadMask [_StencilReadMask]//默认为255,ReadMask的值将和Ref的值以及模板缓冲中的值进行按位与(&)操作再进行比较
WriteMask [_StencilWriteMask]//默认值为255,WriteMask的值是当写入模板缓冲时进行的按位与(&)操作再写入
Comp [_StencilComp]//定义Ref与模板缓冲中的值比较的操作函数,默认值为always
/*
0 Disabled 禁用深度或模板测试。
1 Never 从不通过深度或模板测试。
2 Less 当新值小于旧值时通过深度或模板测试。
3 Equal 当值相等时通过深度或模板测试。
4 LessEqual 当新值小于或等于旧值时通过深度或模板测试。
5 Greater 当新值大于旧值时通过深度或模板测试。
6 NotEqual 当值不同时通过深度或模板测试。
7 GreaterEqual 当新值大于或等于旧值时通过深度或模板测试。
8 Always 始终通过深度或模板测试。
*/
Pass [_StencilOp]// 当模板测试(和深度测试)通过时,则根据(stencilOperation值)对模板缓冲值进行处理,默认值为keep
/*
0 Keep 保留当前模板值。
1 Zero 将模板缓冲区值设置为 0。
2 Replace 将模板缓冲区值替换为引用值(在着色器中指定)。
3 IncrementSaturate 使当前模板缓冲区值增大。限制为可表示的最大无符号值。
4 DecrementSaturate 使当前模板缓冲区值减小。限制为 0。
5 Invert 对当前模板缓冲区值按位求反。
6 IncrementWrap 使当前模板缓冲区值增大。模板缓冲区值为可表示的最大无符号值时,继续增大将重新设置为 0。
7 DecrementWrap 使当前模板缓冲区值减小。模板缓冲区值为 0 时,继续减小将重新设置为可表示的最大无符号值。
*/
//Fail [_StencilOp]//当模板测试(和深度测试)失败时,则根据(stencilOperation值)对模板缓冲值进行处理,默认值为keep
//ZFail [_StencilOp]//当模板测试通过而深度测试失败时,则根据(stencilOperation值)对模板缓冲值进行处理,默认值为keep
}
//Render设置 可选
Cull [_Cull] //选择渲染那个面
/*
Cull off //不剔除
Cull back //剔除背面
Cull front //剔除前面
*/
ZTest [_ZTest] //深度测试
/*
ZTest Less:深度小于当前缓存则通过
ZTest Greater:深度大于当前缓存则通过
ZTest LEqual:深度小于等于当前缓存则通过(默认值)
ZTest GEqual:深度大于等于当前缓存则通过
ZTest Equal:深度等于当前缓存则通过
ZTest NotEqual:深度不等于当前缓存则通过
ZTest Always:不论如何都通过
注意,ZTest Off等同于ZTest Always,关闭深度测试等于完全通过。
*/
Zwrite [_ZWrite] //深度写入
/*
ZWrite On //深度写入开启(默认值)
ZWrite Off //深度写入关闭
*/
/*
ZTest和ZWrite发生在逐片元操作过程,处于片元着色后,最终屏幕输出前。
在开启ZTest下,没有通过测试的片元部分是直接被舍弃,通过测试的片元被保留下来
在关闭ZTest下,不存在片元被舍弃的情况,也就是说,关闭深度测试,整个片元是被保留下来的
在ZWrite开启状态下,只有保留下来片元深度值才能被写入深度缓冲
即:
1.深度测试通过,深度写入开启:写入深度缓冲区,写入颜色缓冲区
2.深度测试通过,深度写入关闭:不写深度缓冲区,写入颜色缓冲区
3.深度测试失败,深度写入开启:不写深度缓冲区,不写颜色缓冲区
4.深度测试失败,深度写入关闭:不写深度缓冲区,不写颜色缓冲区
*/
ColorMask 0
/*
ColorMask RGB | A | 0 | 其他R,G,B,A的组合
ColorMask R,意思是输出颜色中只有R通道会被写入
ColorMask 0,意思是不会输出任何颜色
默认值为RGBA,即四个通道都写入(默认值是ColorMask RGBA)
*/
Blend [_SrcBlend] [_DstBlend]//混合
/*
Blend Off //关闭混合
Blend SrcFactor DstFactor //开启混合,SrcFactor 和 DstFactor 为混合因子(其实就是个系数)
下面是 ShaderLab 支持的一些混合因子:
One 因子:1
Zero 因子:0
SrcColor 源颜色值
SrcAlpha 源颜色的Alpha值
DstColor 目标颜色值
DstAlpha 目标颜色的Alpha值
OneMinusSrcColor 1-源颜色值
OneMinusSrcAlpha 1-源颜色的Alpha值
OneMinusDstColor 1-目标颜色值
OneMinusDstAlpha 1-目标颜色的Alpha值
BlendOp Operation //Operation是混合操作
下面是一些常用的混合操作:
Add src + dst
Sub src - dst
RevSub dst - src
Min 取src和dst较小的一方
Max 取src和dst较大的一样
LogicalClear 只能在DX11使用,全部赋值为0,就是透明
LogicalSet 只能在DX11使用,全部赋值为1,就是黑色
LogicalCopy 只能在DX11使用,复制原像素的值,相当于前面的Blend One Zero
LogicalCopyInverted 只能在DX11使用,把src的值按位取反后渲染
LogicalNoop 只能在DX11使用,渲染dst中的像素,相当于前面的Blend Zero One
LogicalInvert 只能在DX11使用,把dst中的值按位取反后渲染
LogicalAnd 只能在DX11使用,src & dst
LogicalNand 只能在DX11使用,! (src & dst)
LogicalOr 只能在DX11使用,src | dst
LogicalNor 只能在DX11使用,! (src | dst)
LogicalXor 只能在DX11使用,src ^ dst
LogicalEquiv 只能在DX11使用,! ( src ^ dst)
LogicalAndReverse 只能在DX11使用,src & !dst
LogicalAndInverted 只能在DX11使用,!src & dst
LogicalOrReverse 只能在DX11使用,src | !dst
LogicalOrInverted 只能在DX11使用,!src | dst
几种常见的混合类型,类似Photoshop混合模式中的效果:
//正常(Normal)
Blend SrcAlpha OneMinusSrcAlpha
//柔和相加(Soft Addtive)
Blend OneMinusDstAlpha One
//正片叠底(Multiply),即相乘
Blend DstColor Zero
//两倍相乘(2x Multiply)
Blend DstColor SrcColor
//变暗(Darken)
BlendOp Min
Blend One One
//变亮(Lighten)
BlendOp Max
Blend One One
//滤色(Screen)
Blend OneMinusDstColor One
//线性减淡(Linear Dodge)
Blend One One
*/
LOD 100 //不同情况下使用不同的LOD,达到性能提升
//必须
Pass
{
Name "Default" //Pass通道名称
//Tags和Render设置和SubShader里的一样,Pass里的Tags多两个属性,在SubShader里或在Pass里设置都可以,相当于一个全局变量一个局部变量
Tags
{
"LightMode" = "ForwardBase"//定义该Pass通道在Unity渲染流水中的角色
/*
Always 不管哪种渲染路径,该Pass总会渲染,但不计算光照
ForwardBase 用于前向渲染。计算环境光、平行光、逐顶点/SH 和 LightMaps
ForwardAdd 用于前向渲染。计算额外的逐像素光源,一个 Pass 对应一个光源
Deferred 用于延迟渲染。渲染 G 缓冲 (G-buffer)
ShadowCaster 把物体的深度信息渲染到阴影映射纹理或深度纹理中
PrepassBase 用于遗留的延迟渲染。渲染法线和高光反射的指数部分
PrepassFinal 用于遗留的延迟渲染。通过合并纹理、光照和自发光来渲染得到最后的颜色
Vertex、VertexLMRGBM 和 VertexLM 用于遗留的顶点照明渲染
*/
//"RequireOptions"="SoftVegetation"//满足某些条件时才渲染该Pass通道
} //可以在每个Pass通道里面进行定义
//Render设置 可以在每个Pass通道里面进行定义
//CG语言所写的代码,主要是顶点片元着色器
CGPROGRAM
//说明Shader的顶点着色器
#pragma vertex vert
//说明Shader的片元着色器
#pragma fragment frag
// make fog work
#pragma multi_compile_fog
#pragma target 3.0
/*
Unity支持的Shader Target
#pragma target 2.0:相当于D3D9上的Shader Model2.0,不支持顶点纹理采样,不支持显示的LOD纹理采样
#pragma target 3.0:相当于D3D9上的Shader Model3.0 支持顶点纹理采样
#pragma target 4.0:相当于D3D10上的Shader Model4.0支持几何着色器
#pragma target 5.0:相当于D3D11上的Shader Model5.0
*/
//使用包含文件
#include "UnityCG.cginc"
struct appdata
{
float4 vertex : POSITION;
float2 uv : TEXCOORD0;
};
struct v2f
{
float2 uv : TEXCOORD0;
UNITY_FOG_COORDS(1)
float4 vertex : SV_POSITION;
};
//POSITION SV_POSITION 语义
/*
顶点着色器常用输入语义
POSITION:模型空间中的顶点位置,通常是float4类型
NORMAL:顶点法线,通常是float3类型
TANGENT:顶点切线,通常是float4类型
TEXCOORDn:如TEXCOORD0,TEXCOORD1 该顶点的纹理坐标,TEXCOORD0表示第一组坐标纹理,依次类推,通常是float2,float4类型
COLOR:顶点颜色,通常是fixed4或float4类型
Shader Model版本与TEXCOORDn中N支持的个数
Shader Model2:8
Shader Model3:8
Shader Model4:16
Shader Model5:16
顶点着色器常用输出语义
SV_POSITION:裁剪空间中的顶点坐标,结构体中必须包含一个用该语义修饰的变量。等同于DX9中的POSITION。
COLOR0:通常用于输出第一组顶点颜色,不是必须
COLOR1:通常用于输出第二组顶点颜色,不是必须
TEXCOORD0-TEXCOORD7:通常用于输出纹理坐标,不是必须
片元着色器常用输出语义
SV_Target:输出值将会储存到渲染目标(render target)中。等同于DX9中COLOR语义。
*/
//声明Shader的变量
uniform sampler2D _MainTex;
uniform float4 _MainTex_ST;
uniform float4 _MainTex_TexelSize;//图片的尺寸 Vector4(1/width, 1/height, width, height)
/*
声明的变量需要跟Properties里的一致,如果不一致导致不能再Unity的界面上赋值,但可以通过脚本赋值
基本数据类型:Cg支持7种基本的数据类型,分别是:
float, 32 位浮点数据,一个符号位。浮点数据类型被所有的 profile 支持
half,16 为浮点数据
int,32 位整形数据,有些 profile 会将 int 类型作为 float 类型使用
fixed,12 位定点数,被所有的 fragment profiles 所支持
bool,布尔数据,通常用于 if 和条件操作符( ?: ) ,布尔数据类型被所有的profiles 支持
simpler*, 纹理对象的句柄( the handle to a texture object ) ,分为 6 类:
sampler, sampler1D, sampler2D, sampler3D, samplerCUBE, 和 samplerRECT 。DirectX profiles 不支持 samplerRECT 类型, 除此之外这些类型被所有的 pixelprofiles 和 NV40 vertex program profile 所支持( CgUsersManual 30 页) 。由此可见,在不远的未来,顶点程序也将广泛支持纹理操作
string,字符类型,该类型不被当前存在的 profile 所支持,实际上也没有必要在 Cg 程序中用到字符类型,但是你可以通过 Cg runtime API 声明该类型变量,并赋值;因此,该类型变量可以保存 Cg 文件的信息。
前6种类型为常用类型,string类型几乎不使用。此外,Cg还提供了内置的向量数据类型 (built-in vector data types) ,内置的向量数据类型基于基础数据类型。 例如: float4, 表示 float 类型的 4 元向量; bool4, 表示 bool类型 4 元向量。
还能支持数组类型,但不能再Properties里显示
uniform float4 _Points[100]; // 数组变量
uniform float _Points_Num; // 数组长度变量
*/
v2f vert(appdata v)
{
v2f o;
o.vertex = UnityObjectToClipPos(v.vertex);
o.uv = TRANSFORM_TEX(v.uv, _MainTex);
UNITY_TRANSFER_FOG(o,o.vertex);
return o;
}
fixed4 frag(v2f i) : SV_Target
{
// sample the texture
fixed4 col = tex2D(_MainTex, i.uv);
// apply fog
UNITY_APPLY_FOG(i.fogCoord, col);
return col;
}
ENDCG
}
}
//Fallback "Legacy Shaders/Transparent/VertexLit" Fallback Off //当上面shader运行不了的时候会使用下面shader渲染
}
【Unity Shader入门】2、UnityShader最全的文件结构参考
最新推荐文章于 2023-05-06 18:13:08 发布