赞
踩
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渲染 }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。