当前位置:   article > 正文

【Unity Shader入门】2、UnityShader最全的文件结构参考_unity shader header

unity shader header

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渲染
}


  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121
  • 122
  • 123
  • 124
  • 125
  • 126
  • 127
  • 128
  • 129
  • 130
  • 131
  • 132
  • 133
  • 134
  • 135
  • 136
  • 137
  • 138
  • 139
  • 140
  • 141
  • 142
  • 143
  • 144
  • 145
  • 146
  • 147
  • 148
  • 149
  • 150
  • 151
  • 152
  • 153
  • 154
  • 155
  • 156
  • 157
  • 158
  • 159
  • 160
  • 161
  • 162
  • 163
  • 164
  • 165
  • 166
  • 167
  • 168
  • 169
  • 170
  • 171
  • 172
  • 173
  • 174
  • 175
  • 176
  • 177
  • 178
  • 179
  • 180
  • 181
  • 182
  • 183
  • 184
  • 185
  • 186
  • 187
  • 188
  • 189
  • 190
  • 191
  • 192
  • 193
  • 194
  • 195
  • 196
  • 197
  • 198
  • 199
  • 200
  • 201
  • 202
  • 203
  • 204
  • 205
  • 206
  • 207
  • 208
  • 209
  • 210
  • 211
  • 212
  • 213
  • 214
  • 215
  • 216
  • 217
  • 218
  • 219
  • 220
  • 221
  • 222
  • 223
  • 224
  • 225
  • 226
  • 227
  • 228
  • 229
  • 230
  • 231
  • 232
  • 233
  • 234
  • 235
  • 236
  • 237
  • 238
  • 239
  • 240
  • 241
  • 242
  • 243
  • 244
  • 245
  • 246
  • 247
  • 248
  • 249
  • 250
  • 251
  • 252
  • 253
  • 254
  • 255
  • 256
  • 257
  • 258
  • 259
  • 260
  • 261
  • 262
  • 263
  • 264
  • 265
  • 266
  • 267
  • 268
  • 269
  • 270
  • 271
  • 272
  • 273
  • 274
  • 275
  • 276
  • 277
  • 278
  • 279
  • 280
  • 281
  • 282
  • 283
  • 284
  • 285
  • 286
  • 287
  • 288
  • 289
  • 290
  • 291
  • 292
  • 293
  • 294
  • 295
  • 296
  • 297
  • 298
  • 299
  • 300
  • 301
  • 302
  • 303
  • 304
  • 305
  • 306
  • 307
  • 308
  • 309
  • 310
  • 311
  • 312
  • 313
  • 314
  • 315
  • 316
  • 317
  • 318
  • 319
  • 320
  • 321
  • 322
  • 323
  • 324
  • 325
  • 326
  • 327
  • 328
  • 329
  • 330
  • 331
  • 332
  • 333
  • 334
  • 335
  • 336
  • 337
  • 338
  • 339
  • 340
  • 341
  • 342
  • 343
  • 344
  • 345
  • 346
  • 347
  • 348
  • 349
  • 350
  • 351
  • 352
  • 353
  • 354
  • 355
  • 356
  • 357
  • 358
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/很楠不爱3/article/detail/108336
推荐阅读
相关标签
  

闽ICP备14008679号