1. 程式人生 > >《unityshader 入門精要》漫反射光照與高光反射光照模型學習筆記

《unityshader 入門精要》漫反射光照與高光反射光照模型學習筆記

Shader"LT/Blinn-Phong"
{
Properties
    {
        _MainTex ("Texture"2D) = "white" {}
        _Diffuse("Diffuse",Color) = (1,1,1,1)
        _Specular("Specular",Color) = (1,1,1,1)   //高光反射顏色
        _Gloss("gloss"Range(5,30)) = 10//高光區域大小
    }
SubShader
    {
Pass
        {
Tags { "LightMode"="ForwardBase" }    //光照模式注意要設定為Forward


CGPROGRAM
#pragmavertexvert
#pragmafragmentfrag
            #include "Lighting.cginc"

            #include "UnityCG.cginc"

sampler2D _MainTex;
fixed4 _Diffuse;
fixed4 _Specular;
float _Gloss;
float4 _MainTex_ST;

struct appdata
            {
float4vertex : POSITION;
float3normal:NORMAL;
float2 uv : TEXCOORD0;
            };


struct v2f
            {
float2 uv : TEXCOORD0;
float4vertex : SV_POSITION;
float3 worldNormal:TEXCOORD1;
float3 worldPos:TEXCOORD2;
            };


            v2f vert (appdata v)
            {
                v2f o;
                o.worldNormal = normalize(mul((float3x3)unity_ObjectToWorld,v.normal));   //法向量從物件座標系轉換為世界座標

                o.worldPos = mul(unity_ObjectToWorld,v.vertex).xyz;       //頂點從物件座標系轉換為世界座標

                o.vertex = UnityObjectToClipPos(v.vertex);
                o.uv = TRANSFORM_TEX(v.uv, _MainTex);
return o;
            }

fixed4 frag (v2f i) : SV_Target
            {
fixed3ambient = UNITY_LIGHTMODEL_AMBIENT.xyz;
fixed3 worldLightDir = normalize(_WorldSpaceLightPos0.xyz);
//漫反射光照計算
fixed3diffuse = _LightColor0.rgb * _Diffuse.rgb * saturate(dot(i.worldNormal,worldLightDir));

//反射方向= 單位化反射光照計算函式
//fixed3reflectDir=normalize(reflect(-worldLightDir,i.worldNormal));

//視角方向=單位化(相機方向- 頂點位置)世界座標系下
fixed3 ViewDir = normalize(_WorldSpaceCameraPos.xyz-i.worldPos.xyz);
fixed3 halfDir = normalize(worldLightDir+ViewDir);

//反射光=光照顏色*反射光顏色*視角與反射光方向的點積的光滑洗漱次方
fixed3specular = _LightColor0.rgb* _Specular.rgb * pow(saturate(dot(ViewDir,halfDir)),_Gloss); 

fixed4 col = tex2D(_MainTex, i.uv) * fixed4(diffuse + specular + ambient,1.0);
return col;
            }
ENDCG
        }
    }
Fallback"Specular"
}