Shader"Texture"{
properties{
_Color("Color",Color) = (1,1,1,1)
_MainText("Main Tex",2D) = "White"{}
_Specular("Specular Color",Color) = (1,1,1,1)//控制高光顏色
_Gloss("Gloss",Range(8,200)) = 10//控制高光強度
}
SubShader{
Pass {
//定義正確的LightMode得到內(nèi)置的光照變量
Tags{"LightMode" = "ForwardBase"}
CGPROGRAM
//包含unity的內(nèi)置的文件奸攻,才可以使用unity內(nèi)置的一些變量 相當(dāng)于引入內(nèi)置的光照模型
#include "Lighting.cginc"http://取得第一個直射光的顏色 _LightColor0第一個值是光的位置_WorldSpaceLightPos0
#pragma vertex vert
#pragma fragment frag
// fixed4 _Diffuse;
sampler2D _MainText;
fixed4 _Color;
float4 _MainText_ST;//固定寫法定義UV貼圖偏移值縮放值
half _Gloss;
fixed4 _Specular;
struct a2v {
float4 vertex:POSITION;
float3 normal:NORMAL;
float2 texcoord:TEXCOORD0;
};
struct v2f {
float4 position:SV_POSITION;
float3 WorldNomormal : TEXCOORD0;
float3 WorldVertex:TEXCOORD1;
float2 uv:TEXCOORD2;
};
v2f vert(a2v v) {
v2f f;
//UNITY_MATRIX_MVP 這個矩陣用來把一個坐標(biāo)從模型空間轉(zhuǎn)換到剪裁空間
f.position = mul(UNITY_MATRIX_MVP, v.vertex);
f.WorldNomormal = mul(v.normal, (float3x3)unity_WorldToObject);
f.WorldVertex = mul(v.vertex,unity_WorldToObject).xyz;
f.uv = v.texcoord.xy* _MainText_ST.xy+ _MainText_ST.zw;//計算紋理的偏移值和縮放值
return f;
};
fixed4 frag(v2f f) :SV_Target{
//_World2Object 這個矩陣用來把一個方向從世界空間轉(zhuǎn)換到模型空間
fixed3 normalDir = normalize(f.WorldNomormal);//相當(dāng)于把模型空間轉(zhuǎn)換到世界空間
fixed3 lightDir = normalize(_WorldSpaceLightPos0.xyz);//對于每一個頂點來說 光的位置就是光的方向 因為光是平行光
fixed3 texColor=tex2D(_MainText,f.uv.xy)*_Color.rgb;
fixed3 diffuse = _LightColor0.rgb*texColor*max(dot(normalDir, lightDir),0);//取得漫反射的顏色
fixed3 reflectDir = normalize(reflect(-lightDir, normalDir));
fixed3 vlewDir = normalize(_WorldSpaceCameraPos.xyz - f.WorldVertex);
fixed3 specular = _LightColor0.rgb*_Specular.rgb*pow(max(dot(reflectDir, vlewDir), 0), _Gloss);//計算高光
fixed3 tempColor = diffuse + specular+ UNITY_LIGHTMODEL_AMBIENT.rgb*texColor;
return fixed4(tempColor,1);
}
ENDCG
}
}
Fallback"Diffuse"
}
Paste_Image.png
紋理材質(zhì).gif
法線貼圖與凹凸映射的強度
Shader"Rock"{
properties{
_Color("Color",Color) = (1,1,1,1)
_MainTex("Main Tex",2D) = "White"{}
_NormalMap("Normal Map",2D) = "bump"{}//bump使用頂點里面自帶的法線貼圖
_BumpScale("Bump Scale",Float)=1
}
SubShader{
Pass {
//定義正確的LightMode得到內(nèi)置的光照變量
Tags{"LightMode" = "ForwardBase"}
CGPROGRAM
#include "Lighting.cginc"http://取得第一個直射光的顏色 _LightColor0第一個值是光的位置_WorldSpaceLightPos0
#pragma vertex vert
#pragma fragment frag
fixed4 _Color;
sampler2D _MainTex;
float4 _MainTex_ST;//固定寫法定義UV貼圖偏移值縮放值
sampler2D _NormalMap;
float4 _NormalMap_ST;//固定寫法定義UV貼圖偏移值縮放值
float _BumpScale;
struct a2v {
float4 vertex:POSITION;
//切線空間的確定是通過(存儲到模型里面的)法線和(存儲到模型里面的)切線確定的
float3 normal:NORMAL;
float4 tangent:TANGENT;//tangent.w是用來確定切線空間中坐標(biāo)軸的方向的
float2 texcoord:TEXCOORD0;
};
struct v2f {
float4 position:SV_POSITION;
//float3 WorldNomormal : TEXCOORD0;
float3 lightDir : TEXCOORD0;//切線空間下 平行光的方向
float4 uv:TEXCOORD1;//xy用來存儲MainTex的紋理坐標(biāo), zw用來存儲法線貼圖的紋理坐標(biāo)
};
v2f vert(a2v v) {
v2f f;
//UNITY_MATRIX_MVP 這個矩陣用來把一個坐標(biāo)從模型空間轉(zhuǎn)換到剪裁空間
f.position = mul(UNITY_MATRIX_MVP, v.vertex);
/*f.WorldNomormal = mul(v.normal, (float3x3)unity_WorldToObject);*/
f.uv.xy = v.texcoord.xy * _MainTex_ST.xy+ _MainTex_ST.zw;//計算紋理的偏移值和縮放值
f.uv.zw = v.texcoord.xy * _NormalMap_ST.xy + _NormalMap_ST.zw;
TANGENT_SPACE_ROTATION;//調(diào)用這個后虱痕,會得到一個矩陣 rotation 這個矩陣用來把模型空間下的方向裝換成切線空間下
//ObjspaceLightDir(v.vertex)//得到模型空間下的平行光方向
f.lightDir = mul(rotation, ObjSpaceLightDir(v.vertex));
return f;
};
//把所有的跟法線方向有關(guān)的運算都放在切線空間下
//從法線貼圖里面取得的法線方向是在切線空間下的
fixed4 frag(v2f f) :SV_Target{
//_World2Object 這個矩陣用來把一個方向從世界空間轉(zhuǎn)換到模型空間
//fixed3 normalDir = normalize(f.WorldNomormal);//相當(dāng)于把模型空間轉(zhuǎn)換到世界空間
fixed4 normalColor= tex2D(_NormalMap,f.uv.zw);
//pixel = (normal + 1) / 2
//normal = pixel * 2 - 1
fixed3 tangentNormal = UnpackNormal( normalColor); //切線空間下的法線
tangentNormal.xy = tangentNormal.xy*_BumpScale;
tangentNormal = normalize(tangentNormal);
fixed3 lightDir = normalize(f.lightDir);//對于每一個頂點來說 光的位置就是光的方向 因為光是平行光
fixed3 texColor=tex2D(_MainTex,f.uv.xy)*_Color.rgb;
fixed3 diffuse = _LightColor0.rgb*texColor*max(dot(tangentNormal, lightDir),0);//取得漫反射的顏色
fixed3 tempColor = diffuse + UNITY_LIGHTMODEL_AMBIENT.rgb*texColor;
return fixed4(tempColor,1);
}
ENDCG
}
}
Fallback"Spacular"
}
凹凸貼圖.gif
編寫透明的Shader
Shader"Rock Alpha" {
properties{
_Color("Color",Color) = (1,1,1,1)
_MainTex("Main Tex",2D) = "White"{}
_NormalMap("Normal Map",2D) = "bump"{}//bump使用頂點里面自帶的法線貼圖
_BumpScale("Bump Scale",Float)=1
_Alpha("Alpha",Float)=1
}
SubShader{
Tags{"Queue"="Transparent""IngnoreProjector"="True""RanderType"="Transparent"}//"Queue"="Transparent"透明的渲染隊列 "IngnoreProjector"="True"是否忽略投影 "RanderType"="Transparent"類型
Pass {
//定義正確的LightMode得到內(nèi)置的光照變量
Tags{"LightMode" = "ForwardBase"}
ZWrite off//寫入透明深度
Blend SrcAlpha OneMinusSrcAlpha//透明混合參數(shù)
CGPROGRAM
#include "Lighting.cginc"http://取得第一個直射光的顏色 _LightColor0第一個值是光的位置_WorldSpaceLightPos0
#pragma vertex vert
#pragma fragment frag
fixed4 _Color;
sampler2D _MainTex;
float4 _MainTex_ST;//固定寫法定義UV貼圖偏移值縮放值
sampler2D _NormalMap;
float4 _NormalMap_ST;//固定寫法定義UV貼圖偏移值縮放值
float _BumpScale;
float _Alpha;
struct a2v {
float4 vertex:POSITION;
//切線空間的確定是通過(存儲到模型里面的)法線和(存儲到模型里面的)切線確定的
float3 normal:NORMAL;
float4 tangent:TANGENT;//tangent.w是用來確定切線空間中坐標(biāo)軸的方向的
float2 texcoord:TEXCOORD0;
};
struct v2f {
float4 position:SV_POSITION;
//float3 WorldNomormal : TEXCOORD0;
float3 lightDir : TEXCOORD0;//切線空間下 平行光的方向
float4 uv:TEXCOORD1;//xy用來存儲MainTex的紋理坐標(biāo)睹耐, zw用來存儲法線貼圖的紋理坐標(biāo)
};
v2f vert(a2v v) {
v2f f;
//UNITY_MATRIX_MVP 這個矩陣用來把一個坐標(biāo)從模型空間轉(zhuǎn)換到剪裁空間
f.position = mul(UNITY_MATRIX_MVP, v.vertex);
/*f.WorldNomormal = mul(v.normal, (float3x3)unity_WorldToObject);*/
f.uv.xy = v.texcoord.xy * _MainTex_ST.xy+ _MainTex_ST.zw;//計算紋理的偏移值和縮放值
f.uv.zw = v.texcoord.xy * _NormalMap_ST.xy + _NormalMap_ST.zw;
TANGENT_SPACE_ROTATION;//調(diào)用這個后,會得到一個矩陣 rotation 這個矩陣用來把模型空間下的方向裝換成切線空間下
//ObjspaceLightDir(v.vertex)//得到模型空間下的平行光方向
f.lightDir = mul(rotation, ObjSpaceLightDir(v.vertex));
return f;
};
//把所有的跟法線方向有關(guān)的運算都放在切線空間下
//從法線貼圖里面取得的法線方向是在切線空間下的
fixed4 frag(v2f f) :SV_Target{
//_World2Object 這個矩陣用來把一個方向從世界空間轉(zhuǎn)換到模型空間
//fixed3 normalDir = normalize(f.WorldNomormal);//相當(dāng)于把模型空間轉(zhuǎn)換到世界空間
fixed4 normalColor= tex2D(_NormalMap,f.uv.zw);
//pixel = (normal + 1) / 2
//normal = pixel * 2 - 1
fixed3 tangentNormal = UnpackNormal( normalColor); //切線空間下的法線
tangentNormal.xy = tangentNormal.xy*_BumpScale;
tangentNormal = normalize(tangentNormal);
fixed3 lightDir = normalize(f.lightDir);//對于每一個頂點來說 光的位置就是光的方向 因為光是平行光
fixed4 texColor=tex2D(_MainTex,f.uv.xy)*_Color;
fixed3 diffuse = _LightColor0.rgb*texColor.rgb*max(dot(tangentNormal, lightDir),0);//取得漫反射的顏色
fixed3 tempColor = diffuse + UNITY_LIGHTMODEL_AMBIENT.rgb*texColor;
return fixed4(tempColor, _Alpha*texColor.a);
}
ENDCG
}
}
Fallback"Spacular"
}
寫入透明度.gif