Shader Phong高光反射和Blinn Phong高光反射

Phong高光反射(逐顶点)

Shader "MyShader/phong"
{
	Properties
	{
		_Diffuse("diffuse",Color) = (1,1,1,1)
		_Specular("specular",Color) = (1,1,1,1)
		_Gloss("gloss",Range(1,256)) = 5
    }
    SubShader
    {
        Tags { "RenderType"="Opaque" }
        LOD 100

        Pass
        {
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag

            #include "UnityCG.cginc"
            #include "UnityLightingCommon.cginc"

            float4 _Diffuse;
			float4 _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 worldNormal = UnityObjectToWorldNormal(v.normal);
				fixed3 worldLight = normalize(_WorldSpaceLightPos0);
				fixed3 diffuse = _LightColor0.rgb*_Diffuse.rgb*saturate(dot(worldNormal, worldLight));

				//环境光
				fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.rgb;

				//phong高光反射
				fixed3 reflectDir = normalize(reflect(-worldLight, worldNormal));
				fixed3 viewDir = normalize(_WorldSpaceCameraPos - UnityObjectToWorldDir(v.vertex));
				fixed3 specular = _LightColor0.rgb*_Specular.rgb*pow(saturate(dot(reflectDir, viewDir)), _Gloss);
				
				o.color = diffuse + ambient + specular;
				return o;
            }

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

Phong高光反射(逐片元)

Shader "MyShader/phong2"
{
	Properties
	{
		_Diffuse("diffuse",Color) = (1,1,1,1)
		_Specular("specular",Color) = (1,1,1,1)
		_Gloss("gloss",Range(1,256)) = 5
	}
		SubShader
	{
		Tags { "RenderType" = "Opaque" }
		LOD 100

		Pass
		{
			CGPROGRAM
			#pragma vertex vert
			#pragma fragment frag


			#include "UnityCG.cginc"
			#include "UnityLightingCommon.cginc"

			fixed4 _Diffuse;
			float4 _Specular;
			float _Gloss;

			struct v2f
			{
				float4 vertex:SV_POSITION;
				float3 worldNormal:NORMAL;
			};

			v2f vert(appdata_base v)
			{
				v2f o;
				o.vertex = UnityObjectToClipPos(v.vertex);
				o.worldNormal = UnityObjectToWorldNormal(v.normal);
				return o;
			}

			fixed4 frag(v2f i) : SV_Target
			{
				float3 ambient = UNITY_LIGHTMODEL_AMBIENT.rgb;

				float3 worldLight = normalize(_WorldSpaceLightPos0.xyz);
				float3 diffuse = _Diffuse.rgb*_LightColor0.rgb*saturate(dot(worldLight, i.worldNormal));

				float3 reflectDir = normalize(reflect(-worldLight, i.worldNormal));
				float3 viewDir = normalize(_WorldSpaceCameraPos - UnityObjectToWorldDir(i.vertex));
				float3 specular = _LightColor0.rgb*_Specular.rgb*pow(saturate(dot(reflectDir, viewDir)), _Gloss);

				float3 temp = diffuse + ambient + specular;
				return fixed4(temp, 1);
			}
			ENDCG
		}
	}
}

Blinn Phong高光反射

Shader "MyShader/phong3"
{
	Properties
	{
		_Diffuse("diffuse",Color) = (1,1,1,1)
		_Specular("specular",Color) = (1,1,1,1)
		_Gloss("gloss",Range(1,256)) = 5
	}
		SubShader
	{
		Tags { "RenderType" = "Opaque" }
		LOD 100

		Pass
		{
			CGPROGRAM
			#pragma vertex vert
			#pragma fragment frag


			#include "UnityCG.cginc"
			#include "UnityLightingCommon.cginc"

			fixed4 _Diffuse;
			float4 _Specular;
			float _Gloss;

			struct v2f
			{
				float4 vertex:SV_POSITION;
				float3 worldNormal:NORMAL;
			};

			v2f vert(appdata_base v)
			{
				v2f o;
				o.vertex = UnityObjectToClipPos(v.vertex);
				o.worldNormal = UnityObjectToWorldNormal(v.normal);
				return o;
			}

			fixed4 frag(v2f i) : SV_Target
			{
				//环境光
				float3 ambient = UNITY_LIGHTMODEL_AMBIENT.rgb;

				//漫反射
				float3 worldLight = normalize(_WorldSpaceLightPos0.xyz);
				float3 diffuse = _Diffuse.rgb*_LightColor0.rgb*saturate(dot(worldLight, i.worldNormal));

				//blinn Phong高光反射
				//float3 reflectDir = normalize(reflect(-worldLight, i.worldNormal));
				float3 viewDir = normalize(_WorldSpaceCameraPos - UnityObjectToWorldDir(i.vertex));
				float3 halfDir = normalize(_WorldSpaceLightPos0.xyz + viewDir);
				float3 specular = _LightColor0.rgb*_Specular.rgb*pow(saturate(dot(halfDir, i.worldNormal)), _Gloss);

				float3 temp = diffuse + ambient + specular;
				return fixed4(temp, 1);
			}
			ENDCG
		}
	}
}

你可能感兴趣的:(Shader,反射,图形学,unity,shader)