Unity Shader (四)片段程序示例

1、环境光+漫反射+高光+点光源

1Shader "Custom/Example_Frag_1" { 2 properties 3 { 4 _MainColor("Main Color",color)=(1,1,1,1) 5 _SpecularColor("Specular Color",color)=(1,1,1,1) //高光颜色 6 _Shininess("Shininess",range(1,32))=8 //高光范围 7 } 8 Subshader 9 { 10 pass{ 11 tags{"LightMode"="Forwardbase"} 12 13 CGPROGRAM 14 15 #pragma vertex vert 16 #pragma fragment frag 17 #include "unitycg.cginc" 18 #include "lighting.cginc" 19 20 float4 _MainColor; 21 float4 _SpecularColor; 22 float _Shininess; 23 24 struct v2f 25 { 26 float4 pos:POSITION; 27 float3 normal:TEXCOORD1; 28 fixed4 vertex:COLOR; 29 }; 30 31 32 v2f vert(appdata_base v) 33 { 34 v2f o; 35 o.pos=UnityObjectToClipPos(v.vertex); 36 o.normal=v.normal; 37 o.vertex=v.vertex; 38 return o; 39 } 40 float4 frag(v2f IN):COLOR 41 { 42 //Ambinet color 环境光 43 fixed4 col=UNITY_LIGHTMODEL_AMBIENT; 44 45 //Diffuse Color 漫反射光 dot(N,L) 46 float3 N=UnityObjectToWorldNormal(IN.normal); 47 float3 L=normalize(WorldSpaceLightDir(IN.vertex)); 48 float diffuseScale=saturate(dot(N,L)); 49 col+=_LightColor0*_MainColor*diffuseScale; 50 51 //Specular Color 高光 52 float3 V=normalize(WorldSpaceViewDir(IN.vertex)); 53 float3 R=2*dot(N,L)*N-L;//反射光,方案一 54// float3 I=-WorldSpaceLightDir(IN.vertex); 55// float3 R=reflect(I,N);//反射光,方案二 56 float specularScale=saturate(dot(R,V)); 57 col+=_SpecularColor*pow(specularScale,_Shininess); 58 59 //compute 4 points lighting 点光源 60 float3 wpos=mul(_Object2World,IN.vertex).xyz; 61 col.rgb+=Shade4PointLights 62 ( 63 unity_4LightPosX0,unity_4LightPosY0,unity_4LightPosZ0, 64 unity_LightColor[0].rgb,unity_LightColor[1].rgb,unity_LightColor[2].rgb,unity_LightColor[3].rgb, 65 unity_4LightAtten0, 66 wpos,N 67 ); 68 return col;//漫反射+环境光 69 } 70 71 ENDCG 72 } 73 } 74}

 2、阴影

1Shader "Custom/Example_Frag_2" { 2 properties 3 { 4 _MainColor("Main Color",color)=(1,1,1,1) 5 _SpecularColor("Specular Color",color)=(1,1,1,1) //高光颜色 6 _Shininess("Shininess",range(1,32))=8 //高光范围 7 } 8 Subshader 9 { 10 11// pass 12// { 13// tags{"LightMode"="shadowcaster"}//这种方式只能为方向光添加投射阴影 14// } 15 16 pass{ 17 tags{"LightMode"="Forwardbase"} 18 19 CGPROGRAM 20 21 #pragma vertex vert 22 #pragma fragment frag 23 #include "unitycg.cginc" 24 #include "lighting.cginc" 25 26 float4 _MainColor; 27 float4 _SpecularColor; 28 float _Shininess; 29 30 struct v2f 31 { 32 float4 pos:POSITION; 33 float3 normal:TEXCOORD1; 34 fixed4 vertex:COLOR; 35 }; 36 37 38 v2f vert(appdata_base v) 39 { 40 v2f o; 41 o.pos=UnityObjectToClipPos(v.vertex); 42 o.normal=v.normal; 43 o.vertex=v.vertex; 44 return o; 45 } 46 float4 frag(v2f IN):COLOR 47 { 48 //Ambinet color 环境光 49 fixed4 col=UNITY_LIGHTMODEL_AMBIENT; 50 51 //Diffuse Color 漫反射光 dot(N,L) 52 float3 N=UnityObjectToWorldNormal(IN.normal); 53 float3 L=normalize(WorldSpaceLightDir(IN.vertex)); 54 float diffuseScale=saturate(dot(N,L)); 55 col+=_LightColor0*_MainColor*diffuseScale; 56 57 //Specular Color 高光 58 float3 V=normalize(WorldSpaceViewDir(IN.vertex)); 59 float3 R=2*dot(N,L)*N-L;//反射光,方案一 60// float3 I=-WorldSpaceLightDir(IN.vertex); 61// float3 R=reflect(I,N);//反射光,方案二 62 float specularScale=saturate(dot(R,V)); 63 col+=_SpecularColor*pow(specularScale,_Shininess); 64 65 //compute 4 points lighting 点光源 66 float3 wpos=mul(unity_ObjectToWorld,IN.vertex).xyz; 67 col.rgb+=Shade4PointLights 68 ( 69 unity_4LightPosX0,unity_4LightPosY0,unity_4LightPosZ0, 70 unity_LightColor[0].rgb,unity_LightColor[1].rgb,unity_LightColor[2].rgb,unity_LightColor[3].rgb, 71 unity_4LightAtten0, 72 wpos,N 73 ); 74 return col;//漫反射+环境光 75 } 76 77 ENDCG 78 } 79 } 80 //取巧的方法是,让其回滚到系统自带的Diffuse中, 81 //这样既可以产生方向光阴影,点光源也可以产生阴影 82 fallback "Diffuse" 83}

 3、镂空效果

1Subshader 2 { 3 Tags{"Queue"="Transparent"} 4 pass{ 5 blend srcAlpha oneMinussrcalpha       zwrite off 6 7 CGPROGRAM 8 9 #pragma vertex vert 10 #pragma fragment frag 11 #include "unitycg.cginc" 12 13 float _Scale; 14 15 struct v2f 16 { 17 float4 pos:POSITION; 18 float3 normal:TEXCOORD0; 19 fixed4 vertex:TEXCOORD1; 20 }; 21 22 23 v2f vert(appdata_base v) 24 { 25 v2f o; 26 o.pos=UnityObjectToClipPos(v.vertex); 27 o.normal=v.normal; 28 o.vertex=v.vertex; 29 return o; 30 } 31 float4 frag(v2f IN):COLOR 32 { 33 float3 N=UnityObjectToWorldNormal(IN.normal); 34 float3 V=UnityWorldSpaceViewDir(IN.vertex); 35 float bright=1.0-saturate(dot(N,V)); 36 bright=pow(bright,_Scale); 37 return fixed4(1,1,1,1)*bright; 38 } 39 40 ENDCG 41 } 42 } 43 44}

 4、描边

1Shader "Custom/Example_Frag_4" { 2 properties 3 { 4 _MainColor("MainColor",color)=(1,1,1,1) 5 _Scale("Scale",range(1,8))=2 6 _Outer("Outer",range(0,1))=0.2 7 } 8 Subshader 9 { 10 Tags{"Queue"="Transparent"} 11 pass{ 12 blend srcAlpha oneMinussrcalpha 13 zwrite off 14 15 CGPROGRAM 16 17 #pragma vertex vert 18 #pragma fragment frag 19 #include "unitycg.cginc" 20 21 float4 _MainColor; 22 float _Scale; 23 float _Outer; 24 25 struct v2f 26 { 27 float4 pos:POSITION; 28 float3 normal:TEXCOORD0; 29 fixed4 vertex:TEXCOORD1; 30 }; 31 32 33 v2f vert(appdata_base v) 34 { 35 v.vertex.xyz+=v.normal*_Outer; 36 v2f o; 37 o.pos=UnityObjectToClipPos(v.vertex); 38 o.normal=v.normal; 39 o.vertex=v.vertex; 40 return o; 41 } 42 float4 frag(v2f IN):COLOR 43 { 44 float3 N=UnityObjectToWorldNormal(IN.normal); 45 float3 V=UnityWorldSpaceViewDir(IN.vertex); 46 float bright=saturate(dot(N,V)); 47 bright=pow(bright,_Scale); 48 _MainColor.a*=bright; 49 return _MainColor; 50 } 51 52 ENDCG 53 } 54 55 pass{ 56 blendop revsub 57 blend dstalpha one 58 zwrite off 59 60 CGPROGRAM 61 62 #pragma vertex vert 63 #pragma fragment frag 64 #include "unitycg.cginc" 65 66 struct v2f 67 { 68 float4 pos:POSITION; 69 }; 70 71 72 v2f vert(appdata_base v) 73 { 74 v2f o; 75 o.pos=UnityObjectToClipPos(v.vertex); 76 return o; 77 } 78 float4 frag(v2f IN):COLOR 79 { 80 return fixed4(1,1,1,1); 81 } 82 83 ENDCG 84 } 85 86 pass{ 87 blend srcAlpha oneMinussrcalpha 88 zwrite off 89 90 CGPROGRAM 91 92 #pragma vertex vert 93 #pragma fragment frag 94 #include "unitycg.cginc" 95 96 float _Scale; 97 98 struct v2f 99 { 100 float4 pos:POSITION; 101 float3 normal:TEXCOORD0; 102 fixed4 vertex:TEXCOORD1; 103 }; 104 105 106 v2f vert(appdata_base v) 107 { 108 v2f o; 109 o.pos=UnityObjectToClipPos(v.vertex); 110 o.normal=v.normal; 111 o.vertex=v.vertex; 112 return o; 113 } 114 float4 frag(v2f IN):COLOR 115 { 116 float3 N=UnityObjectToWorldNormal(IN.normal); 117 float3 V=UnityWorldSpaceViewDir(IN.vertex); 118 float bright=saturate(dot(N,V)); 119 bright=pow(bright,_Scale); 120 return fixed4(1,1,1,1)*bright; 121 } 122 123 ENDCG 124 } 125 } 126 127}

 5、贴图及光照贴图

1Shader "Custom/Example_Frag_6" { 2 Properties { 3 _MainTex ("Albedo (RGB)", 2D) = "white" {} 4 } 5 SubShader { 6 pass{ 7 CGPROGRAM 8 #pragma vertex vert 9 #pragma fragment frag 10 #include "unitycg.cginc" 11 12 sampler2D _MainTex; 13 float4 _MainTex_ST; 14 15 struct v2f{ 16 float4 pos:POSITION; 17 float2 uv:TEXCOORD0; 18 float2 uv_lighting:TEXCOORD1; 19 }; 20 v2f vert(appdata_full v) 21 { 22 v2f o; 23 o.pos=UnityObjectToClipPos(v.vertex); 24 o.uv=TRANSFORM_TEX(v.texcoord,_MainTex);//让属性面板中的Tiling和Offset起作用,这里需要声明 _ST 后缀的变量,这里是_MainTex_ST 25 o.uv_lighting=v.texcoord1.xy*unity_LightmapST.xy+unity_LightmapST.zw;//使用光照贴图 26 return o; 27 28 } 29 fixed4 frag(v2f IN):COLOR 30 { 31 float3 lm=DecodeLightmap(UNITY_SAMPLE_TEX2D(unity_Lightmap,IN.uv_lighting));//解码光照贴图 32 fixed4 color=tex2D(_MainTex,IN.uv); 33 color.rgb*=lm; 34 return color; 35 } 36 ENDCG 37 } 38 } 39}

 6、波

1Shader "Custom/Example_Frag_7" { 2 Properties { 3 _MainTex ("Albedo (RGB)", 2D) = "white" {} 4 _F("F",range(1,30))=10 5 _A("A",range(0,0.1))=0.01 6 _R("R",range(0,1))=0 7 } 8 SubShader { 9 pass{ 10 CGPROGRAM 11 #pragma vertex vert 12 #pragma fragment frag 13 #include "unitycg.cginc" 14 15 sampler2D _MainTex; 16 float4 _MainTex_ST; 17 float _F; 18 float _A; 19 float _R; 20 21 struct v2f{ 22 float4 pos:POSITION; 23 float2 uv:TEXCOORD0; 24 }; 25 v2f vert(appdata_full v) 26 { 27 v2f o; 28 o.pos=UnityObjectToClipPos(v.vertex); 29 o.uv=TRANSFORM_TEX(v.texcoord,_MainTex); 30 return o; 31 32 } 33 fixed4 frag(v2f IN):COLOR 34 { 35// IN.uv+=0.01*sin(IN.uv*3.14*_F+_Time.y);//水波 36 37 float2 uv=IN.uv; 38 float dis=distance(uv,float2(0.5,0.5)); 39 float scale=0; 40 _A*=saturate(1-dis/_R); 41 scale=_A*sin(-dis*3.14*_F+_Time.y);//圆形涟漪 42 uv=uv+uv*scale; 43 fixed4 color=tex2D(_MainTex,uv); 44 return color; 45 } 46 ENDCG 47 } 48 } 49}

 7、模糊

1Shader "Custom/Example_Frag_8" { 2 Properties { 3 _MainTex ("Albedo (RGB)", 2D) = "white" {} 4 _F("F",range(1,30))=10 5 _A("A",range(0,0.1))=0.01 6 _R("R",range(0,1))=0 7 } 8 SubShader { 9 pass{ 10 CGPROGRAM 11 #pragma vertex vert 12 #pragma fragment frag 13 #include "unitycg.cginc" 14 #pragma target 3.0 15 sampler2D _MainTex; 16 float4 _MainTex_ST; 17 float _F; 18 float _A; 19 float _R; 20 21 struct v2f{ 22 float4 pos:POSITION; 23 float2 uv:TEXCOORD0; 24 float z:TEXCOORD1; 25 }; 26 v2f vert(appdata_full v) 27 { 28 v2f o; 29 o.pos=UnityObjectToClipPos(v.vertex); 30 o.uv=TRANSFORM_TEX(v.texcoord,_MainTex); 31 o.z=mul(unity_ObjectToWorld,v.vertex).z; 32 return o; 33 34 } 35 fixed4 frag(v2f IN):COLOR 36 { 37 float2 dsdx=ddx(IN.z)*10; 38 float2 dsdy=ddy(IN.z)*10; 39 fixed4 color=tex2D(_MainTex,IN.uv,dsdx,dsdy);//越正对的面越清晰,背对着的面模糊 40 return color; 41 } 42 ENDCG 43 } 44 } 45}
点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

2020年前端实用代码段,为你的工作保驾护航

有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )