今天我們來學習一下怎麼在unity裡實現自定義phong光照模型
什麼是phong光照?
環境光和漫反射光比較容易計算,那鏡面高光要如何計算呢?
鏡面高光其實可以通過利用入射光方向(即光照方向的反方向)和法線計算出反射光方向,然後再通過反射光方向和觀察視角方向計算出實際進入眼睛的光照強度,然後再做乙個光滑係數的指數運算就可以得到鏡面高光了。
反射光方向 = reflect(-lightdir, normal)
spec = dot(反射光方向, viewdir)
specular = pow(spec, specpower)
下面是在unity的表面著色器中實現的自定義phong光照模型:
shader "custom/phong"
_specpower ("specular power", range(1.0, 20.0)) = 1.0
}subshader
lod 200
cgprogram
#pragma su***ce surf phong
#pragma target 3.0
sampler2d _maintex;
struct input ;
float4 _color;
float _specpower;
void surf (input in, inout su***ceoutput o)
inline fixed4 lightingphong(su***ceoutput s, fixed3 lightdir, half3 viewdir, fixed atten)
endcg
}fallback "diffuse"
}
如果是頂點片段著色器又該如何實現phong光照呢?其實差不多,原理都一樣,如下:
shader "unlit/phong_frag"
_color ("color", color) = (1,1,1,1)
_specularpower ("specular power", range(1, 100)) = 1
}subshader
lod 100
pass
;struct v2f
;sampler2d _maintex;
float4 _maintex_st;
fixed4 _color;
float _specularpower;
fixed4 frag (v2f i) : sv_target
endcg}}
}
Unity Shader自定義光照模型
前幾天去一家公司面試,因為簡歷上寫著 能寫簡單的shader 就被問了乙個問題 怎麼自定義乙個光照模型?直接懵逼了,隱隱約約能聯想到的什麼漫反射光 鏡面反射光 環境光.難道是這個?光照模型就是 pragam su ce surf lambert裡面的那個lambert唄?這不都是寫好的嗎?還能自定義...
UnityShader自定義屬性面板
基本的屬性有,好像又是沒什麼規律,就乙個個試試吧 properties secondtex secondtex 2d white tintcolor color color 0.5,0.5,0.5,1 bright bright float 2 space 50 toggle drivesecond...
UnityShader自學日誌 建立自定義著色器
在 asset 中,建立乙個新的standard su ce shader,在mono或者vs中開啟,將原有的 段全部刪除 加入以下 每行 具體功能如下所示 shader packt moon 指定了該著色器在著色器選單中的名稱 基礎紋理貼圖,2d指定該屬性是乙個二維貼圖 子著色器 subshade...