- 물리 기반 쉐이더의 구조 (Standard Shader)
struct SurfaceOutputStandard { fixed3 Albedo; //물체의 기본 색상 fixed3 Normal; //NormalMap fixed3 Emission; //빛의 영향을 받지 않는 색상 half Metallic; //재질이 금속인가 아닌가? half Smoothness; //재질이 거친가 매끈한가? half Occlusion; //차폐되어 어둡게 되는 강도 half Alpha; //알파 };
- 물리 기반 쉐이더 이전의 쉐이더 구조 (Lambert, Blinn Phong)
struct SurfaceOutput { half3 Albedo; //물체의 기본 색상 half3 Normal; //NormalMap half3 smission; //빛의 영향을 받지 않는 색상 half Specular; //Specular의 넓이. 얼마나 넓은 하이라이트가 나오는가. 수치가 높으면 하이라이트가 작아진다. half Gloss; //Specular의 강도 순수한 Specular의 Opacily 같은 느낌 half Alpha; //알파 }
☑️즉, 유니티에 내장된 라이팅은 총 3가지
Standard
라이팅 대신 Lambert
라이팅을 사용하기 위해 라이팅 함수 이름을 바꿔주고, 라이팅 함수의 구조체도 구형 구조체 SurfaceOutput
으로 바꿔준다.o.Emission
과 o.Normal
을 그대로 사용할 수 있다.BlinnPhong
라이팅 함수 이름으로 바꾸고, 라이팅 함수의 구조체도 구형 구조체를 사용한다.
o.Gloss
: Specular의 강도 (0이면 둔탁한 재질, 1이면 매끄러운 재질)o.Specular
: Specular의 크기
_MainTex
에 어두운 텍스쳐를 넣거나, o.Albedo
에 색이 어둡게 들어가도록 강제로 만들어 주어서 하이라이트를 확인한다.☑️ BlinnPhong 공식의 특이한 예외
Properties { _MainTex("Albedo (RGB)", 2D) = "white" {} _SpecColor("Specular Color", Color) = (1, 1, 1, 1) } float4 _SpecColor; //에러 !!
- 위와 같이
_SpecColor
를 받는float4 _SpecColor;
를 선언하면 에러가 발생한다._SpecColor
는 BlinnPhong 공식이 구현된 내부 코드안에서 받고있는 예약어이며 절대로 코드 내부에서 받아서는 안되고 다른 이름을 써서도 안된다.