9 – 02 ~ 03 Lambert (램버트) / Blinn-Phong(블린-퐁) (Unity Shader)
유니티4 이전 시절에 존재하던 가벼운 라이팅 방식인 Lambert 라이팅
램버트 라이팅 초기 구조
Shader "Custom/Lambert" { Properties { _MainTex ("Albedo (RGB)", 2D) = "white" {} } SubShader { Tags { "RenderType"="Opaque" } LOD 200 CGPROGRAM #pragma surface surf Lambert #pragma target 3.0 sampler2D _MainTex; struct Input { float2 uv_MainTex; }; void surf (Input IN, inout SurfaceOutput o) { fixed4 c = tex2D (_MainTex, IN.uv_MainTex); o.Albedo = c.rgb; o.Alpha = c.a; } ENDCG } FallBack "Diffuse" }
둔탁한 느낌의 이미지가 Lambert 라이트의 특징입니다.
o.Specular / o.Gloss 는 사용하지 않으므로 값을 넣어도 나타나지 않습니다.
겉으로는 크게 바뀐 것 같지 않지만 내장된 기본 라이팅 구조 중에서 가장 가벼운 라이트입니다. (저사양 기기에서도 잘 구동됩니다.)
간단한 Blinn Phong 라이트 구현
Shader "Custom/BlinnPhong" { Properties { _MainTex ("Albedo (RGB)", 2D) = "white" {} } SubShader { Tags { "RenderType"="Opaque" } LOD 200 CGPROGRAM #pragma surface surf BlinnPhong #pragma target 3.0 sampler2D _MainTex; struct Input { float2 uv_MainTex; }; void surf (Input IN, inout SurfaceOutput o) { fixed4 c = tex2D (_MainTex, IN.uv_MainTex); o.Albedo = c.rgb; o.Alpha = c.a; } ENDCG } FallBack "Diffuse" }
BlinnPhong 공식이 가동 되었지만 Specular는 보이지 않습니다.
Specular를 보기위해 추가로 데이터를 입력합니다.
Shader "Custom/BlinnPhong" { Properties { _MainTex ("Albedo (RGB)", 2D) = "white" {} _SpecColor("SpecColor", color) = (1,1,1,1) } SubShader { Tags { "RenderType"="Opaque" } LOD 200 CGPROGRAM #pragma surface surf BlinnPhong #pragma target 3.0 sampler2D _MainTex; struct Input { float2 uv_MainTex; }; void surf (Input IN, inout SurfaceOutput o) { fixed4 c = tex2D (_MainTex, IN.uv_MainTex); o.Albedo = c.rgb; o.Specular = 0.5; o.Gloss = 1; o.Alpha = c.a; } ENDCG } FallBack "Diffuse" }
위의 코드에서 어디에서도 _SpecColor 를 받는 부분이 없습니다.
_SpecColor 는 절대로 코드에서 받으면 안 되고, 단지 Properties 에서만 만들어야 한다는 것 입니다.
그리고 _SpecColor 라는 이름 외에 다른 이름을 써서도 안됩니다.
BlinnPong 내부의 코드를 열어보면 _SpecColor 이름이 예약어이며 절대로 코드 내부에서 받으면 안된다는 특이한 예외 사항이 존재합니다.
o.Gloss 는 0~ 1 사이의 값을 넣어야 하며 Specular 의 강도를 의미합니다.
0이면 둔탁한 재질 / 1이면 매끄러운 재질을 의미합니다.
o.Specular는 0~ 1 사이의 값을 넣어야 하며 Specular 의 크기를 의미합니다.
0이면 크기가 커지고 / 1이면 크기가 작아집니다.
확인용 코드
Shader "Custom/BlinnPhong" { Properties { _MainTex ("Albedo (RGB)", 2D) = "white" {} _SpecColor("SpecColor", color) = (1,1,1,1) _SpecAmount("SpecAmount",Range(0,1)) = 0.5 _GlossAmount("_GlossAmount",Range(0,1)) = 1 } SubShader { Tags { "RenderType"="Opaque" } LOD 200 CGPROGRAM #pragma surface surf BlinnPhong #pragma target 3.0 sampler2D _MainTex; float _SpecAmount; float _GlossAmount; struct Input { float2 uv_MainTex; }; void surf (Input IN, inout SurfaceOutput o) { fixed4 c = tex2D (_MainTex, IN.uv_MainTex); o.Albedo = c.rgb; o.Specular = _SpecAmount; o.Gloss = _GlossAmount; o.Alpha = c.a; } ENDCG } FallBack "Diffuse" }