Unity Shader标准光照模型——高光反射

高光反射

顶点高光反射
Shader "Unlit/HighLightReflection"
{
    Properties
    {
        _diffuse("diffuse",Color) = (1,1,1,1)
        _specular("Specular",Color) = (1,1,1,1)
        _gloss("Gloss",Range(1,5)) = 5
    }
    SubShader
    {
        Tags { "RenderType"="Opaque" }
        LOD 100

        Pass
        {
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag

            #include "UnityCG.cginc"
            #include "Lighting.cginc"
            fixed4 _diffuse;
            fixed4 _specular;
            float _gloss;
            struct v2f
            {
                float4 vertex : SV_POSITION;
                fixed3 color : Color;
            };


            v2f vert (appdata_base v)
            {
                v2f o;
                o.vertex = UnityObjectToClipPos(v.vertex);
                fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz;
                //将法线转换到世界坐标下的法线
                fixed3 worldNormal = UnityObjectToWorldNormal(v.normal);
                //光源方向
                //fixed3 worldLight = normalize(_WorldSpaceLightPos0.xyz);
                fixed3 worldLight = normalize(WorldSpaceLightDir(v.vertex));    //unity自己提供的一个计算光源方向的函数
                //兰伯特公式
                fixed3 diffuse = _LightColor0.rgb * _diffuse.rgb * saturate(dot(worldNormal,worldLight));
                //计算反射方向,reflect方法就是计算基于法线方向的入射光线的反射光线的计算。由于方法计算与unity的世界光照方向相反,所以需要加个-值
                fixed3 reflectDir = normalize(reflect(-worldLight,worldNormal));    
                //视角方向,V向量
                //fixed3 viewDir = normalize(_WorldSpaceCameraPos.xyz - UnityObjectToWorldDir(v.vertex));
                fixed3 viewDir = normalize(WorldSpaceViewDir(v.vertex)); //unity自己提供的一个计算视角 方向的函数
                //phong高光反射公式,gloss为调整高光程度的一个次幂级数
                fixed3 specular = _LightColor0.rgb * _specular.rgb * pow(max(0,dot(reflectDir,viewDir)),_gloss);
                o.color =  diffuse + ambient + specular;
                return o;
            }

            fixed4 frag (v2f i) : SV_Target
            {
                return fixed4(i.color,1);
            }
            ENDCG
        }
    }
}


片元高光反射
Shader "Unlit/FragmentHighLight"
{
    Properties
    {
        _diffuse("diffuse",Color) = (1,1,1,1)
        _specular("Specular",Color) = (1,1,1,1)
        _gloss("Gloss",Range(1,5)) = 5
    }
    SubShader
    {
        Tags { "RenderType"="Opaque" }
        LOD 100

        Pass
        {
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag

            #include "UnityCG.cginc"
            #include "Lighting.cginc"
            fixed4 _diffuse;
            fixed4 _specular;
            float _gloss;
            struct v2f
            {
                float4 vertex : SV_POSITION;
                fixed3 worldNormal : TEXCOORD0;
                fixed3 worldPos : TEXCOORD1;
            };


            v2f vert (appdata_base v)
            {
                v2f o;
                o.vertex = UnityObjectToClipPos(v.vertex);
                
                //将法线转换到世界坐标下的法线
                fixed3 worldNormal = UnityObjectToWorldNormal(v.normal);
                //光源方向
                o.worldNormal = worldNormal;
                o.worldPos = UnityObjectToWorldDir(v.vertex);
                return o;
            }

            fixed4 frag (v2f i) : SV_Target
            {
                //环境光
                fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz;
                //光源方向
                //fixed3 worldLightDir = normalize(_WorldSpaceLightPos0.xyz);
                fixed3 worldLightDir = normalize(WorldSpaceLightDir(i.vertex));  
                //兰伯特公式
                fixed3 diffuse = _LightColor0.rgb * _diffuse.rgb * max(0,dot(worldLightDir,i.worldNormal));

                //计算反射方向,reflect方法就是计算基于法线方向的入射光线的反射光线的计算。由于方法计算与unity的世界光照方向相反,所以需要加个-值
                fixed3 reflectDir = normalize(reflect(-worldLightDir,i.worldNormal));
                //视角方向,V向量
                //fixed3 viewDir = normalize(_WorldSpaceCameraPos.xyz - i.worldPos.xyz);
                fixed3 viewDir = normalize(WorldSpaceViewDir(i.vertex)); //unity自己提供的一个计算视角 方向的函数
                //phong高光反射公式,gloss为调整高光程度的一个次幂级数
                fixed3 specular = _LightColor0.rgb * _specular.rgb * pow(max(0,dot(reflectDir,viewDir)),_gloss);
                fixed3 color = ambient + diffuse + specular;
                return fixed4(color,1);
            }
            ENDCG
        }
    }
}

Blinn_phong高光反射公式

Shader "Unlit/BlinnPhongHighLight"
{
    Properties
    {
        _diffuse("diffuse",Color) = (1,1,1,1)
        _specular("Specular",Color) = (1,1,1,1)
        _gloss("Gloss",Range(1,5)) = 5
    }
    SubShader
    {
        Tags { "RenderType"="Opaque" }
        LOD 100

        Pass
        {
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag

            #include "UnityCG.cginc"
            #include "Lighting.cginc"
            fixed4 _diffuse;
            fixed4 _specular;
            float _gloss;
            struct v2f
            {
                float4 vertex : SV_POSITION;
                fixed3 worldNormal : TEXCOORD0;
                fixed3 worldPos : TEXCOORD1;
            };


            v2f vert (appdata_base v)
            {
                v2f o;
                o.vertex = UnityObjectToClipPos(v.vertex);
                
                //将法线转换到世界坐标下的法线
                fixed3 worldNormal = UnityObjectToWorldNormal(v.normal);
                //光源方向
                o.worldNormal = worldNormal;
                o.worldPos = UnityObjectToWorldDir(v.vertex);
                return o;
            }

            fixed4 frag (v2f i) : SV_Target
            {
                //环境光
                fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz;
                //光源方向
                //fixed3 worldLightDir = normalize(_WorldSpaceLightPos0.xyz);
                fixed3 worldLightDir = normalize(WorldSpaceLightDir(i.vertex));  
                //兰伯特公式
                fixed3 diffuse = _LightColor0.rgb * _diffuse.rgb * max(0,dot(worldLightDir,i.worldNormal));

                //计算反射方向,reflect方法就是计算基于法线方向的入射光线的反射光线的计算。由于方法计算与unity的世界光照方向相反,所以需要加个-值
                //fixed3 reflectDir = normalize(reflect(-worldLightDir,i.worldNormal));

              
                //视角方向,V向量
                fixed3 viewDir = normalize(WorldSpaceViewDir(i.vertex)); //unity自己提供的一个计算视角 方向的函数
                  //计算半角向量
                fixed3 halfDir = normalize(worldLightDir + viewDir);
                //blinn_phong高光反射公式,gloss为调整高光程度的一个次幂级数
                fixed3 specular = _LightColor0.rgb * _specular.rgb * pow(max(0,dot(i.worldNormal,halfDir)),_gloss);
                fixed3 color = ambient + diffuse + specular;
                return fixed4(color,1);
            }
            ENDCG
        }
    }
}

你可能感兴趣的:(unity,Shader,unity,游戏引擎,图形渲染)