《unityshader 入門精要》漫反射光照與高光反射光照模型學習筆記
阿新 • • 發佈:2019-01-02
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"
}
{
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"
}