漫反射
漫反射計算公式 : C diffuse = (C light · M diffuse ) max(0 , n · l )
C light :入射光線的強度和顏色
M diffuse : 材質的漫反射系數 物體本色
n : 法線單位向量
l : 光源單位向量
逐頂點漫反射代碼 :
效果圖:

Shader "DiffuseVertex" { Properties { _Diffuse ("Diffuse",Color)=(1,1,1,1) } SubShader { Pass{ Tags{"LightMode" = "ForwardBase"} CGPROGRAM #pragma vertex vert #pragma fragment frag #include "Lighting.cginc" fixed4 _Diffuse;//獲取反漫射顏色(既上面設定的物體自身顏色) struct a2v{ float4 vertex : POSITION; float3 normal : NORMAL; }; struct v2f{ float4 pos : SV_POSITION; fixed3 color : COLOR; }; //逐頂點漫反射 v2f vert(a2v v){ v2f o; o.pos = UnityObjectToClipPos(v.vertex); fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz;//環境光 //由于下方法線光線兩個向量點乘必須處于 同一坐標系下 所以此處將此處的頂點轉換到 //通過矩陣坐標空間轉換 以及 單位轉換 算出單位法線向量 //unity_WorldToObject 既 _World2Object 變換矩陣 可將模型空間轉換到世界空間 //通過調換順序已達到此矩陣的轉置矩陣 注意 mul 乘法公式從左到右 //由于法線向量是個三維矢量 將變換矩陣通過 float3x3 轉成3x3矩陣 fixed3 worldNormal = normalize(mul(v.normal,(float3x3)unity_WorldToObject)); // 取得光線的單位向量 fixed3 worldLight = normalize(_WorldSpaceLightPos0.xyz); // normalize 單位化 歸一化 //通過點乘 獲得 法線與光線的夾角 saturate 只截取[0,1]范圍內 防止為負數 s //光線的顏色*漫反射的顏色(物體本色)*光線與法線的夾角 光線照射的角度 fixed3 diffuse = _LightColor0.rgb * _Diffuse.rgb * saturate(dot(worldNormal,worldLight)); //環境光與漫反射相加 得到最終的顏色 o.color = ambient + diffuse; return o; } //片元著色器直接輸出 fixed4 frag(v2f i) : SV_Target{ return fixed4(i.color,1.0); } ENDCG } } FallBack "Diffuse" }
逐片元(像素)漫反射代碼 :
效果圖:

Shader "DiffusePixel" { Properties { _Diffuse ("Diffuse",Color)=(1,1,1,1) } SubShader { Pass{ Tags{"LightMode" = "ForwardBase"} CGPROGRAM #pragma vertex vert #pragma fragment frag #include "Lighting.cginc" fixed4 _Diffuse;//獲取反漫射顏色(既上面設定的物體自身顏色) struct a2v{ float4 vertex : POSITION; float3 normal : NORMAL; }; struct v2f{ float4 pos : SV_POSITION; float3 worldNormal : TEXCOORD0; }; v2f vert(a2v v){ v2f o; //投影矩陣 將模型空間轉換為裁切空間 o.pos = UnityObjectToClipPos(v.vertex); //空間轉換 o.worldNormal = mul(v.normal,(float3x3)unity_WorldToObject); //將世界空間下的法線傳遞給片元著色器 return o; } fixed4 frag(v2f i) : SV_Target{ fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz;//環境光 //同逐頂點 fixed3 worldNormal = normalize(i.worldNormal); //光線單位向量 fixed3 worldLightDir = normalize(_WorldSpaceLightPos0.xyz); //漫反射計算主體 fixed3 diffuse = _LightColor0.rgb * _Diffuse.rgb * saturate(dot(worldNormal,worldLightDir)); //顏色疊加計算出最后的顏色 fixed3 color = ambient + diffuse; //回傳 return fixed4(color,1.0); } ENDCG } } FallBack "Diffuse" }
半蘭伯特公式 像素漫反射:
效果圖:

Shader "HalfLambert" { Properties { _Diffuse ("Diffuse",Color)=(1,1,1,1) } SubShader { Pass{ Tags{"LightMode" = "ForwardBase"} CGPROGRAM #pragma vertex vert #pragma fragment frag #include "Lighting.cginc" fixed4 _Diffuse;//獲取反漫射顏色(既上面設定的物體自身顏色) struct a2v{ float4 vertex : POSITION; float3 normal : NORMAL; }; struct v2f{ float4 pos : SV_POSITION; float3 worldNormal : TEXCOORD0; }; v2f vert(a2v v){ v2f o; //投影矩陣 將模型空間轉換為裁切空間 o.pos = UnityObjectToClipPos(v.vertex); //空間轉換 o.worldNormal = mul(v.normal,(float3x3)unity_WorldToObject); //將世界空間下的法線傳遞給片元著色器 return o; } fixed4 frag(v2f i) : SV_Target{ fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz;//環境光 //同逐頂點 fixed3 worldNormal = normalize(i.worldNormal); //光線單位向量 fixed3 worldLightDir = normalize(_WorldSpaceLightPos0.xyz); //漫反射計算主體 //fixed3 diffuse = _LightColor0.rgb * _Diffuse.rgb * saturate(dot(worldNormal,worldLightDir)); //利用半蘭伯特公示計算 原理是將原來的max控制最低值的方法給取消 //取代為將值變為原來的一半 原[-1,1] 乘上0.5得 [-0.5,0.5] 最后加上0.5 得 [0,1] 因此稱為半蘭伯特 //通過這種方法 能夠使背光面也會有光線明暗過渡 而不是如同一張紙一樣呈現出一個顏色 fixed halfLambert = dot(worldNormal,worldLightDir) * 0.5 + 0.5; fixed3 diffuse = _LightColor0.rgb * _Diffuse.rgb * halfLambert; //顏色疊加計算出最后的顏色 fixed3 color = ambient + diffuse; //回傳 return fixed4(color,1.0); } ENDCG } } FallBack "Diffuse" }
三種型別的漫反射反射:

TRANSLATE with
| Arabic | Hebrew | Polish |
| Bulgarian | Hindi | Portuguese |
| Catalan | Hmong Daw | Romanian |
| Chinese Simplified | Hungarian | Russian |
| Chinese Traditional | Indonesian | Slovak |
| Czech | Italian | Slovenian |
| Danish | Japanese | Spanish |
| Dutch | Klingon | Swedish |
| English | Korean | Thai |
| Estonian | Latvian | Turkish |
| Finnish | Lithuanian | Ukrainian |
| French | Malay | Urdu |
| German | Maltese | Vietnamese |
| Greek | Norwegian | Welsh |
| Haitian Creole | Persian |
- 中文(簡體)
- 中文(繁體)
- 丹麥語
- 烏克蘭語
- 烏爾都語
- 亞美尼亞語
- 俄語
- 保加利亞語
- 克羅地亞語
- 冰島語
- 加泰羅尼亞語
- 匈牙利語
- 卡納達語
- 印地語
- 印尼語
- 古吉拉特語
- 哈薩克語
- 土耳其語
- 威爾士語
- 孟加拉語
- 尼泊爾語
- 布爾語(南非荷蘭語)
- 希伯來語
- 希臘語
- 庫爾德語
- 德語
- 意大利語
- 拉脫維亞語
- 挪威語
- 捷克語
- 斯洛伐克語
- 斯洛文尼亞語
- 旁遮普語
- 日語
- 普什圖語
- 毛利語
- 法語
- 波蘭語
- 波斯語
- 泰盧固語
- 泰米爾語
- 泰語
- 海地克里奧爾語
- 愛沙尼亞語
- 瑞典語
- 立陶宛語
- 緬甸語
- 羅馬尼亞語
- 老撾語
- 芬蘭語
- 英語
- 荷蘭語
- 薩摩亞語
- 葡萄牙語
- 西班牙語
- 越南語
- 阿塞拜疆語
- 阿姆哈拉語
- 阿爾巴尼亞語
- 阿拉伯語
- 韓語
- 馬爾加什語
- 馬拉地語
- 馬拉雅拉姆語
- 馬來語
- 馬耳他語
- 高棉語
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/539337.html
標籤:其他
