Unity Shader (四)片段程序示例

Wesley13
• 阅读 552

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

Unity Shader (四)片段程序示例

Shader "Custom/Example_Frag_1" {
    properties
    {
        _MainColor("Main Color",color)=(1,1,1,1)
        _SpecularColor("Specular Color",color)=(1,1,1,1) //高光颜色
        _Shininess("Shininess",range(1,32))=8 //高光范围
    }
    Subshader
    {
        pass{
            tags{"LightMode"="Forwardbase"}

            CGPROGRAM

            #pragma vertex vert
            #pragma fragment frag
            #include "unitycg.cginc"
            #include "lighting.cginc"

            float4 _MainColor;
            float4 _SpecularColor;
            float _Shininess;

            struct v2f
            {
                float4 pos:POSITION;
                float3 normal:TEXCOORD1;
                fixed4 vertex:COLOR;
            };


            v2f vert(appdata_base v)
            {
                v2f o;
                o.pos=UnityObjectToClipPos(v.vertex);
                o.normal=v.normal;
                o.vertex=v.vertex;
                return o;
            }
            float4 frag(v2f IN):COLOR
            {
                //Ambinet color 环境光
                fixed4 col=UNITY_LIGHTMODEL_AMBIENT;

                //Diffuse Color 漫反射光 dot(N,L)
                float3 N=UnityObjectToWorldNormal(IN.normal);
                float3 L=normalize(WorldSpaceLightDir(IN.vertex));
                float diffuseScale=saturate(dot(N,L));
                col+=_LightColor0*_MainColor*diffuseScale;

                //Specular Color 高光
                float3 V=normalize(WorldSpaceViewDir(IN.vertex));
                float3 R=2*dot(N,L)*N-L;//反射光,方案一
//                float3 I=-WorldSpaceLightDir(IN.vertex);
//                float3 R=reflect(I,N);//反射光,方案二
                float specularScale=saturate(dot(R,V));
                col+=_SpecularColor*pow(specularScale,_Shininess);

                //compute 4 points lighting 点光源
                float3 wpos=mul(_Object2World,IN.vertex).xyz;
                col.rgb+=Shade4PointLights
                (
                    unity_4LightPosX0,unity_4LightPosY0,unity_4LightPosZ0,
                    unity_LightColor[0].rgb,unity_LightColor[1].rgb,unity_LightColor[2].rgb,unity_LightColor[3].rgb,
                    unity_4LightAtten0,
                    wpos,N
                );
                return col;//漫反射+环境光
            }

            ENDCG
        }
    }
}

 2、阴影

Unity Shader (四)片段程序示例

Shader "Custom/Example_Frag_2" {
    properties
    {
        _MainColor("Main Color",color)=(1,1,1,1)
        _SpecularColor("Specular Color",color)=(1,1,1,1) //高光颜色
        _Shininess("Shininess",range(1,32))=8 //高光范围
    }
    Subshader
    {

//        pass
//        {
//            tags{"LightMode"="shadowcaster"}//这种方式只能为方向光添加投射阴影
//        }

        pass{
            tags{"LightMode"="Forwardbase"}

            CGPROGRAM

            #pragma vertex vert
            #pragma fragment frag
            #include "unitycg.cginc"
            #include "lighting.cginc"

            float4 _MainColor;
            float4 _SpecularColor;
            float _Shininess;

            struct v2f
            {
                float4 pos:POSITION;
                float3 normal:TEXCOORD1;
                fixed4 vertex:COLOR;
            };


            v2f vert(appdata_base v)
            {
                v2f o;
                o.pos=UnityObjectToClipPos(v.vertex);
                o.normal=v.normal;
                o.vertex=v.vertex;
                return o;
            }
            float4 frag(v2f IN):COLOR
            {
                //Ambinet color 环境光
                fixed4 col=UNITY_LIGHTMODEL_AMBIENT;

                //Diffuse Color 漫反射光 dot(N,L)
                float3 N=UnityObjectToWorldNormal(IN.normal);
                float3 L=normalize(WorldSpaceLightDir(IN.vertex));
                float diffuseScale=saturate(dot(N,L));
                col+=_LightColor0*_MainColor*diffuseScale;

                //Specular Color 高光
                float3 V=normalize(WorldSpaceViewDir(IN.vertex));
                float3 R=2*dot(N,L)*N-L;//反射光,方案一
//                float3 I=-WorldSpaceLightDir(IN.vertex);
//                float3 R=reflect(I,N);//反射光,方案二
                float specularScale=saturate(dot(R,V));
                col+=_SpecularColor*pow(specularScale,_Shininess);

                //compute 4 points lighting 点光源
                float3 wpos=mul(unity_ObjectToWorld,IN.vertex).xyz;
                col.rgb+=Shade4PointLights
                (
                    unity_4LightPosX0,unity_4LightPosY0,unity_4LightPosZ0,
                    unity_LightColor[0].rgb,unity_LightColor[1].rgb,unity_LightColor[2].rgb,unity_LightColor[3].rgb,
                    unity_4LightAtten0,
                    wpos,N
                );
                return col;//漫反射+环境光
            }

            ENDCG
        }
    }
    //取巧的方法是,让其回滚到系统自带的Diffuse中,
    //这样既可以产生方向光阴影,点光源也可以产生阴影
    fallback "Diffuse"
}

 3、镂空效果

Unity Shader (四)片段程序示例

Subshader
    {
        Tags{"Queue"="Transparent"}
        pass{
            blend srcAlpha oneMinussrcalpha       zwrite off

            CGPROGRAM

            #pragma vertex vert
            #pragma fragment frag
            #include "unitycg.cginc"

            float _Scale;

            struct v2f
            {
                float4 pos:POSITION;
                float3 normal:TEXCOORD0;
                fixed4 vertex:TEXCOORD1;
            };


            v2f vert(appdata_base v)
            {
                v2f o;
                o.pos=UnityObjectToClipPos(v.vertex);
                o.normal=v.normal;
                o.vertex=v.vertex;
                return o;
            }
            float4 frag(v2f IN):COLOR
            {
                float3 N=UnityObjectToWorldNormal(IN.normal);
                float3 V=UnityWorldSpaceViewDir(IN.vertex);
                float bright=1.0-saturate(dot(N,V));
                bright=pow(bright,_Scale);
                return fixed4(1,1,1,1)*bright;
            }

            ENDCG
        }
    }

}

 4、描边

Unity Shader (四)片段程序示例

Shader "Custom/Example_Frag_4" {
    properties
    {
        _MainColor("MainColor",color)=(1,1,1,1)
        _Scale("Scale",range(1,8))=2
        _Outer("Outer",range(0,1))=0.2
    }
    Subshader
    {
        Tags{"Queue"="Transparent"}
        pass{
            blend srcAlpha oneMinussrcalpha
            zwrite off

            CGPROGRAM

            #pragma vertex vert
            #pragma fragment frag
            #include "unitycg.cginc"

            float4 _MainColor;
            float _Scale;
            float _Outer;

            struct v2f
            {
                float4 pos:POSITION;
                float3 normal:TEXCOORD0;
                fixed4 vertex:TEXCOORD1;
            };


            v2f vert(appdata_base v)
            {
                v.vertex.xyz+=v.normal*_Outer;
                v2f o;
                o.pos=UnityObjectToClipPos(v.vertex);
                o.normal=v.normal;
                o.vertex=v.vertex;
                return o;
            }
            float4 frag(v2f IN):COLOR
            {
                float3 N=UnityObjectToWorldNormal(IN.normal);
                float3 V=UnityWorldSpaceViewDir(IN.vertex);
                float bright=saturate(dot(N,V));
                bright=pow(bright,_Scale);
                _MainColor.a*=bright;
                return _MainColor;
            }

            ENDCG
        }
    
    pass{
            blendop revsub
            blend dstalpha one
            zwrite off

            CGPROGRAM

            #pragma vertex vert
            #pragma fragment frag
            #include "unitycg.cginc"

            struct v2f
            {
                float4 pos:POSITION;
            };


            v2f vert(appdata_base v)
            {
                v2f o;
                o.pos=UnityObjectToClipPos(v.vertex);
                return o;
            }
            float4 frag(v2f IN):COLOR
            {
                return fixed4(1,1,1,1);
            }

            ENDCG
        }
    
        pass{
            blend srcAlpha oneMinussrcalpha
            zwrite off

            CGPROGRAM

            #pragma vertex vert
            #pragma fragment frag
            #include "unitycg.cginc"

            float _Scale;

            struct v2f
            {
                float4 pos:POSITION;
                float3 normal:TEXCOORD0;
                fixed4 vertex:TEXCOORD1;
            };


            v2f vert(appdata_base v)
            {
                v2f o;
                o.pos=UnityObjectToClipPos(v.vertex);
                o.normal=v.normal;
                o.vertex=v.vertex;
                return o;
            }
            float4 frag(v2f IN):COLOR
            {
                float3 N=UnityObjectToWorldNormal(IN.normal);
                float3 V=UnityWorldSpaceViewDir(IN.vertex);
                float bright=saturate(dot(N,V));
                bright=pow(bright,_Scale);
                return fixed4(1,1,1,1)*bright;
            }

            ENDCG
        }
    }

}

 5、贴图及光照贴图

Unity Shader (四)片段程序示例

Shader "Custom/Example_Frag_6" {
    Properties {
        _MainTex ("Albedo (RGB)", 2D) = "white" {}
    }
    SubShader {
        pass{
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #include "unitycg.cginc"

            sampler2D _MainTex;
            float4 _MainTex_ST;

            struct v2f{
                float4 pos:POSITION;
                float2 uv:TEXCOORD0;
                float2 uv_lighting:TEXCOORD1;
            };
            v2f vert(appdata_full v)
            {
                v2f o;
                o.pos=UnityObjectToClipPos(v.vertex);
                o.uv=TRANSFORM_TEX(v.texcoord,_MainTex);//让属性面板中的Tiling和Offset起作用,这里需要声明 _ST 后缀的变量,这里是_MainTex_ST
                o.uv_lighting=v.texcoord1.xy*unity_LightmapST.xy+unity_LightmapST.zw;//使用光照贴图
                return o;

            }
            fixed4 frag(v2f IN):COLOR
            {
                float3 lm=DecodeLightmap(UNITY_SAMPLE_TEX2D(unity_Lightmap,IN.uv_lighting));//解码光照贴图
                fixed4 color=tex2D(_MainTex,IN.uv);
                color.rgb*=lm;
                return color;
            }
            ENDCG
        }
    }
}

 6、波

Unity Shader (四)片段程序示例

Shader "Custom/Example_Frag_7" {
    Properties {
        _MainTex ("Albedo (RGB)", 2D) = "white" {}
        _F("F",range(1,30))=10
        _A("A",range(0,0.1))=0.01
        _R("R",range(0,1))=0
    }
    SubShader {
        pass{
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #include "unitycg.cginc"

            sampler2D _MainTex;
            float4 _MainTex_ST;
            float _F;
            float _A;
            float _R;

            struct v2f{
                float4 pos:POSITION;
                float2 uv:TEXCOORD0;
            };
            v2f vert(appdata_full v)
            {
                v2f o;
                o.pos=UnityObjectToClipPos(v.vertex);
                o.uv=TRANSFORM_TEX(v.texcoord,_MainTex);
                return o;

            }
            fixed4 frag(v2f IN):COLOR
            {
//                IN.uv+=0.01*sin(IN.uv*3.14*_F+_Time.y);//水波

                float2 uv=IN.uv;
                float dis=distance(uv,float2(0.5,0.5));
                float scale=0;
                _A*=saturate(1-dis/_R);
                scale=_A*sin(-dis*3.14*_F+_Time.y);//圆形涟漪
                uv=uv+uv*scale;
                fixed4 color=tex2D(_MainTex,uv);
                return color;
            }
            ENDCG
        }
    }
}

 7、模糊

Unity Shader (四)片段程序示例

Shader "Custom/Example_Frag_8" {
    Properties {
        _MainTex ("Albedo (RGB)", 2D) = "white" {}
        _F("F",range(1,30))=10
        _A("A",range(0,0.1))=0.01
        _R("R",range(0,1))=0
    }
    SubShader {
        pass{
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #include "unitycg.cginc"
            #pragma target 3.0
            sampler2D _MainTex;
            float4 _MainTex_ST;
            float _F;
            float _A;
            float _R;

            struct v2f{
                float4 pos:POSITION;
                float2 uv:TEXCOORD0;
                float z:TEXCOORD1;
            };
            v2f vert(appdata_full v)
            {
                v2f o;
                o.pos=UnityObjectToClipPos(v.vertex);
                o.uv=TRANSFORM_TEX(v.texcoord,_MainTex);
                o.z=mul(unity_ObjectToWorld,v.vertex).z;
                return o;

            }
            fixed4 frag(v2f IN):COLOR
            {
                float2 dsdx=ddx(IN.z)*10;
                float2 dsdy=ddy(IN.z)*10;
                fixed4 color=tex2D(_MainTex,IN.uv,dsdx,dsdy);//越正对的面越清晰,背对着的面模糊
                return color;
            }
            ENDCG
        }
    }
}
点赞
收藏
评论区
推荐文章
blmius blmius
2年前
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
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
2星期前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Stella981 Stella981
2年前
KVM调整cpu和内存
一.修改kvm虚拟机的配置1、virsheditcentos7找到“memory”和“vcpu”标签,将<namecentos7</name<uuid2220a6d1a36a4fbb8523e078b3dfe795</uuid
Wesley13 Wesley13
2年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
2年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
2年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Wesley13 Wesley13
2年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
6个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这