본문 바로가기

Unity3D C#/유니티 쉐이더 공부

유니티에 내장된 라이팅 구조

우리가 쉐이더를 처음 만들면 자동적으로 생성되는 Standard Shader는 유니티5부터 기본으로 적용된 쉐이더 형태. 이 Standard Shadr의 라이팅은 분명 좋은 라이팅이지만, 물리 기반 쉐이더 라이트이기 때문에 모바일과 같은 저사양 기기에서 구동하기에는 다소 무거움

그래서 유니티 내부적으로 유니티 4버전 이전부터 사용하던 라이트 구조도 그대로 구현되어 있음. 이 라이팅은 물리 기반 쉐이더 이전의 다른 3D 프로그램에서도 흔하게 사용되던 구조로 구조체 차이가 있음. 이 라이팅은 물리 기반 쉐이더보다 품질은 떨어질 수 있지만 상대적으로 가볍기 때문에 물리 기반 쉐이더를 사용할 필요 없이 가볍게 처리해야 하는 모바일 프로젝트에 적합한 쉐이더 구조라고 할 수 있음

하지만 하드웨어의 성능이 높아지고 유저의 요구 수준이 높아지면서 최근에는 물리 기반 쉐이더가 모바일에서도 점차 표준이 되고 있는 상황. 물론 여전히 구형 방식의 라이팅 구조를 사용할 가치는 많음.


물리 기반 쉐이더(Standard Shader - Metallic pass)

struct SurfaceOutputStandard

{

fixed3 Albedo; - 물체의 기본 색상

fixed3 Normal; - NormalMap

fixed3 Emission; - 빛의 영향을 받지 않는 색상

half Metallic; - 재질이 금속인가 아닌가?

half Sommthness; - 재질이 거친가 매끈한가?

half Occlusion; - 차폐되어 어둡게 되는 강도

half Alpha; - 알파

}


물리 기반 쉐이더 구조인 램버트(Lambert)와 블린 퐁(Blinn Phong) 라이트에서 사용하는 입력 구조체

struct SurfaceOutput

{

fixed3 Albedo; - 물체의 기본 색상

fixed3 Normal; - NormalMap

fixed3 Emission; - 빛의 영향을 받지 않는 색상

half Specular; - Specular의 넓이. 얼마나 넓은 하이라이트가 나오는가. 수치가 높으면 하이라이트가 작아짐

half Gloss; - Specular의 강도. 순수한 Specular의 Opacity같은 느낌

half Alpha; - 알파

}


유니티에 내장되어 있는 라이팅은 총 3가지 

Lambert(램버트)

Specular 공식이 없고 단지 빛에 의한 밝고 어두움이 구현된 가벼운 라이트 구조. SurfaceOutput 구조체를 사용한다.

Blinn Phong(블린 퐁)

램버트 공식에 가벼운 Specular 공식인 블린 퐁 공식이 더해진 라이트 구조. Specular 공식은 보는 각도와 조명 각도에 따라 계산된 특정 색의 하이라이트 동그라미로 표현된다. SurfaceOutput 구조체를 사용한다.

Standard(스탠다드)

일명 PBS(물리 기반 쉐이더: Physically Based Shader). 주변 환경을 반사해서 Specular를 구현하며, Diffuse와 Specular가 에너지 보존 법칙에 의해 서로 보완관계를 자동적으로 가지며 Specular의 칼라가 메탈릭 속성에 따라 자동적으로 결정되는 라이트 구조 SurfaceOutputStandard 구조체와 SurfaceOutputStandardSpecular 구조체를 사용한다.