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


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


  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Unity Shader是一种用于渲染图形的程序,它可以控制对象的表面颜色、纹理、透明度、反射等属性,从而实现特殊的视觉效果。对于游戏开发者来说,掌握Shader编写技巧是非常重要的。 以下是关于Unity Shader入门精要: 1. ShaderLab语言 ShaderLab是Unity中用于编写Shader的语言,它是一种基于标记的语言,类似于HTML。ShaderLab可以用于定义Shader的属性、子着色器、渲染状态等信息。 2. CG语言 CG语言是Unity中用于编写Shader的主要语言,它是一种类似于C语言的语言,可以进行数学运算、向量计算、流程控制等操作。CG语言可以在ShaderLab中嵌入,用于实现Shader的具体逻辑。 3. Unity的渲染管线 Unity的渲染管线包括顶点着色器、片元着色器、几何着色器等组件,每个组件都有不同的作用。顶点着色器用于对对象的顶点进行变换,片元着色器用于计算每个像素的颜色,几何着色器用于处理几何图形的变形和细节等。 4. 模板和纹理 在Shader中,我们可以使用纹理来给对象添加图案或者贴图,也可以使用模板来控制对象的透明度、反射等属性。纹理可以通过内置函数tex2D()来获取,模板可以通过内置函数clip()来实现裁剪。 5. Shader的实现 Shader的实现需要注意以下几点: - 在ShaderLab中定义Shader的属性、子着色器、渲染状态等信息。 - 在CG语言中实现Shader的具体逻辑,包括顶点着色器、片元着色器等内容。 - 使用纹理和模板来实现特定的视觉效果。 - 在对象上应用Shader,通过调整Shader的属性来达到不同的效果。 以上是关于Unity Shader入门精要,希望对你有所帮助。如果你想更深入地了解Shader的编写技巧,可以参考官方文档或者相关教程。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值