Shader学习笔记

最近学习 Shader中,备忘录吧,自己看的

实现效果


高光纹理光照模型展示图.png

高光纹理光照模型

Shader "Unlit/NewUnlitShader"
{
    Properties{
        _Diffuse("Color Tint",Color) =(1.0,1.0,1.0)//漫反射颜色
        _Specular("Specular",Color) =(1,1,1)//反射光颜色
        _Gloss("Gloss",Range(2,256)) = 5//反射光大小
        _MainTex("MainTex",2D) = "White"{}//贴图纹理
        _Color("Color",Color) = (1.0,1.0,1.0)//贴图颜色
    }
    SubShader
    {
        LOD 100
        Pass
        {
            Tags {"LightMode"="ForwardBase"}//渲染模式-常用格式 Tags{"标签"=""}

            CGPROGRAM
            #pragma vertex vert //方法声明
            #pragma fragment frag

            #include "Lighting.cginc"
            #include "UnityCG.cginc"

            fixed4 _Diffuse; // 漫反射
            fixed4 _Specular; //高光系数
            half _Gloss; //高光区域大小

            sampler2D _MainTex;//贴图
            float4 _MainTex_ST;//这里名字不能乱取 _MainTex取自贴图名称,S代表Scale-缩放,T代表Transform-偏移,_MainTex.xy代表缩放,_MainTex.zw代表偏移
            fixed4 _Color;//颜色

            //a-application 2-to v-view  application to view //获取对象的属性,更具语义会自动把数据填充,用的时候直接取就行
            struct a2v {
                float4 vertex : POSITION;
                float3 normal : NORMAL;
                float4 texcoord : TEXCOORD0;
            };
            //存储属性 当处理完数据后,将数据对应存储到这个结构体内,然后返回,
            //这里祈祷存储属性的作用,同样的,更具语义会给相应的的系统属性设置数据
            struct v2f {
                float4 pos : SV_POSITION;
                float3 worldNormal : TEXCOORD0;
                float3 worldPos:TEXCOORD1;
                float2 uv : TEXCOORD2;
                
            };

            v2f vert (a2v v){
                v2f o;
                o.pos = UnityObjectToClipPos(v.vertex);//裁剪到摄像机视图
                o.worldNormal = mul(v.normal,(float3x3)unity_WorldToObject);//转换到世界法线
                o.worldPos = mul(unity_ObjectToWorld,v.vertex).xyz;//转好到世界位置
                o.uv = TRANSFORM_TEX(v.texcoord,_MainTex);//计算变换后的纹理坐标
                return o;
            } 

            fixed4 frag(v2f i) :SV_Target{
                //纹理采样,第一个参数是纹理名字,第二个纹理uv坐标
                fixed3 albedo = tex2D(_MainTex,i.uv).rgb * _Color.rgb; 

                fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz * albedo;//获取光线

                fixed3 normalDir = normalize(UnityObjectToWorldNormal(i.worldNormal));//法线方向

                fixed3 wordLightDir = normalize(_WorldSpaceLightPos0.xyz);//获取世界光方向->归一

                //漫反射计算公式公式:光照颜色 * 漫反射颜色 * 绝对值(世界法线于世界光方向的点积)-> 兰伯特漫反射定律 
                //缺陷是背光面完全看不见 
                //升级版 半兰伯特漫反射定律 -> 光照颜色 * 漫反射颜色 * 绝对值(世界法线于世界光方向的点积 * 0.5 +0.5)
                fixed3 diffuse = _LightColor0.rgb * _Diffuse.rgb * saturate(dot(normalDir,wordLightDir)*0.5+0.5);

                //fixed3 reflectDir = normalize(reflect(-wordLightDir,normalDir));
                //获取视角方向
                fixed3 viewDir = normalize(UnityWorldSpaceViewDir(i.worldPos));

                // fixed3 viewDir = normalize(_WorldSpaceCameraPos.xyz - mul(unity_ObjectToWorld, v.vertex).xyz);
                //高光反射方向
                fixed3 halfDir = normalize(wordLightDir+viewDir);
                //公式: 入射光颜色 * 材质反射颜色 * (绝对值(视角方向和反射光方向的点积)^光泽度)
                fixed3 specular = _LightColor0.rgb * _Specular.rgb * pow(saturate(dot(normalDir,halfDir)),_Gloss);
                //将渲染颜色返回
               return fixed4(ambient + diffuse + specular,1);
            }
            ENDCG
        }
    }
}

透明度测试

实现效果展示
Shader "Unlit/JKShader"
{
    Properties
    {
        _Color ("Color",Color) = (1,1,1,1)
        _MainTex ("Texture", 2D) = "white" {}
        _CutOff("Cut Off",Range(0,1)) = 0.5
    }
    SubShader
    {
        Tags { "Queue"="AlphaTest" "IgnoreProjector"="True" "RenderType"="TransparentCutout" }

        Pass
        {
            Tags {"LightModel"="ForwardBase"}

            CGPROGRAM
// Upgrade NOTE: excluded shader from DX11; has structs without semantics (struct v2f members pos,worldNormal,worldPos,uv)
#pragma exclude_renderers d3d11
            #pragma vertex vert
            #pragma fragment frag
            // make fog work

            #include "UnityCG.cginc"
            #include "Lighting.cginc"

            fixed4 _Color;
            sampler2D _MainTex;
            float4 _MainTex_ST;
            fixed _CutOff;

            struct a2v{
                float4 vertex : POSITION;
                float3 normal : NORMAL;
                float4 texcoord : TEXCOORD0;
            };

            struct v2f{
                float4 pos : SV_POSITION;
                float3 worldNormal : TEXCOORD0;
                float3 worldPos : TEXCOORD1;
                float2 uv : TEXCOORD2;
            };
            //顶点着色器
            v2f vert(a2v v) {
                v2f o;
                o.pos = UnityWorldToClipPos(v.vertex);
                o.worldNormal = UnityObjectToWorldNormal(v.normal);
                o.worldPos = mul(unity_ObjectToWorld,v.vertex).xyz;
                o.uv = TRANSFORM_TEX(v.texcoord,_MainTex);
                return o;
            }
            //片元着色器
            fixed4 frag(v2f i):SV_Target{
                fixed3 worldNormal = normalize(i.worldNormal);
                fixed3 worldLightDir = normalize(UnityWorldSpaceLightDir(i.worldPos));
                fixed4 texColor = tex2D(_MainTex,i.uv);//采样

                clip(texColor.a - _CutOff);// texColor.a < _Cutoff 则舍弃渲染 discard

                fixed3 albedo= texColor.rgb * _Color.rgb;//颜色和输入颜色混合=>入射光颜色

                fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz * albedo;//环境光混合采样颜色

                fixed3 diffuse = _LightColor0.rgb * albedo * saturate(dot(worldNormal,worldLightDir));

                return fixed4(ambient+diffuse,1.0);
            }
           
            ENDCG
        }
    }
}

你可能感兴趣的:(Shader学习笔记)