본문 바로가기

유니티 쉐이더 스타트업

[ 유니티 쉐이더 스타트업 ] 09 . Lambert / Blinn Phong

[ 유니티 내장 라이팅 구조 ]

[ Standard Shader ]

유니티 5부터 기본으로 적용된 쉐이더인 Standard Stader의 라이팅은 좋은 라이팅 구조이지만

물리기반 쉐이더 라이트이기에 모바일과 같은 저사양 기기에서 구동하기는 무겁다 .

 

그렇기에 유니티 내부에는 4버전 이전부터 사용하던 라이트 구조가 남아있다 .

물리 기반 쉐이더보다 품질은 떨어지지만 상대적으로 가볍기에 물리기반 쉐이더를 사용 할 필요 없이

가볍게 처리해야 하는 모바일 프로젝트에 적합한 쉐이더 구조이다 .


[ Standard Shader의 구조체 ]

다음은 물리기반쉐이더의 구조체이다 .

struct SurfaceOutputStandard
{
	fixed3 Albedo;   (물체의 기본 색상)
    fixed3 Normal;	 (Normal Map)
    fixed3 Emission; (빛의 영향을 받지 않는 색상)
    half Metallic;	 (재질의 금속 여부)
    half Smoothness; (재질의 매끈함)
    half Occlusion;  (차폐되어 어두운 정도)
    half Alpha;		 (알파)
}

다음은 물리기반쉐이더 이전 쉐이더 구조인 램버트 / 블린봉 라이트에서 사용하는 입력 구조체이다

struct SurfaceOuput
{
	half3 Albedo;		(물체의 기본 색상)
    half3 Normal;		(Normal Map)
    half3 Emission;		(빛의 영향을 받지 않는 색상)
    half Specular;		(Specular의 넓이.얼마나 넓은 하이라이트가 나오는가)
    hlaf Gloss;			(Specular의 강도)
    half Alpha			(알파)
}

즉 , 유니티에 내장된 라이팅은 총 3가지이다 .

  • Lambert :Specular 공식이 없고 단지 빛에 의한 밝고 어두움이 구현된 가벼운 라이트 구조.
  • Blinn Phong :램버트 공식에 가벼운 Specular공식 블린퐁 공식이 더해진 라이트 구조.Specular 공식은 보는 각도와 조명 각도에 따라 계산된 특정 색의 하이라이트 동그라미로 표현 .
  • Standard : PBS(물리기반)쉐이더 . 주변환경을 반사해서 Specular를 구현. Diffuse와 Specular가 에너지 보존 법칙에 의해 서로 보완관계를 가지고 Specular의 색상이 메탈릭 송성에 따라 자동으로 결정되는 라이트구조인                        SurfaceOutputStandard 구조체와 SurfaceOutputStandardSpecular구조체를 사용한다 .

 


 

[ Lambert 라이팅 만들기 ]

[ Lambert ]

음영은 계산하지만 Specular는 계산하지 않는 전통적이고 가벼운 라이팅 공식이다 .

위와 같이 두군데를 바꾸어 준다 .

해당 라이팅 함수에서는 Emission/Normal 사용 할 수 있다 .

다만 Specular는 구현 할 수 없으므로 o.Specular / o.Gloss에 어떤값을 넣어도 변화는 없다 .

 

해당 라이팅 구조는 내장된 기본 라이팅 구조중 가장 가벼워 저사양 기기에서도 잘 동작한다 .

 


 

[ Blinn-Pong 라이팅 만들기 ]

[ Blinn-Pong ]

부이 통 퐁 박사의 논문에서 발표된 퐁 공식은 제임스 블린에 의해 Blinn - Pong 공식으로 계량되었다 .

이 공식은 Specular 를 가볍게 표현 할 수 있는 공식이었고 , 유니티에서 해당 공식이 들어가 있다 .

 

위의 부분을 바꾸어 준다 .

 

특이하게도 , BlinnPhong 공식에서만 가동하는 예외사항이 있다 .

_SpecColor("Specular Color",color)=(1,1,1,1)

다음 구문을 받는 코드가 어디에도 없다 .

또한 저 값을 코드내에서 평범하게 받으면 에러가 발생한다 .

 

즉 , _SpecColor는 코드에서 받으면 안되고 프러파티만 만들어야 하는 것이다 .

또한 해당 이름외에 다른 이름은 사용해서는 안된다 .

이는 BlinnPhong 공식이 구현된 내부 코드에서 해당 값을 받고 있기 때문이다 .

 

즉,_SpecColor는 예약어이고 절대로 코드 내부에서 받아서는 안된다는 특이한 예외사항이 있다 .

 

o.Gloss=1;
o.Specular=0.5;

Gloss는 0과 1 사이의 값이 들어가야 하며 Specular의 강도를 의미한다 .

0은 둔탁한 재질 1은 매끄러운 재질을 의미한다 .

 

Specular는 0과 1 사이의 값이 들어가야 하며 Specular의 크기를 의미한다 .

0에 가까워질수록 Specular의 크기가 커지면 1에 가까울수록 작아진다 .