[클라우디아 도피오슬래시]유니티 물리 기반 셰이더 개발 01
셰이더란?
- 최종 이미지가 우리 눈에 사실적으로 보이게 하기 위해 미시적 관점에서의 표면(surface)에서 일어나는 일들을 코드화한 시뮬레이션이다.
- GPU에서 동작하는 코드 조각이다.
셰이더의 종류
- 정점 셰이더(Vertex Shaders): 모든 정점마다 수행됨
- 프레그먼트 셰이더(Fragment Shaders): 최종 픽셀이 될 만한 모든 후보 픽셀(프레그먼트)마다 수행됨
- 언릿 셰이더(Unlit Shaders): 유니티에서만 해당함. 정점과 픽셀 셰이더를 한 파일로 묶은 셰이더
- 표면 셰이더(Surface Shaders): 유니티에서만 해당함. 정점과 프레그먼트 셰이더 기능을 모두 포함한다. Cg 셰이딩 언얼를 셰이더 랩(ShaderLab)확장을 지원해 일반적으로 라이팅 셰이더에서 사용하는 몇 가지 코드들을 자동화해준다.
- 이미지 효과 셰이더: 유니티에서만 해당함. 블러(Blur), 블롬(Bloom), 피사계심도(Depth of Filed), 색저종(Color grading)등과 같은 효과를 적용하는 데 사용한다. 일반적으로 렌더러에서 가장 나중에 실행되는 셰이더이다. 이는 씬의 기하학적인 렌더러에 적용되기 때문이다.
좌표쳬계
- 로컬(객체) 공간: 모델이 렌더링될 상대적인 3D 좌표 시스템
- 월드 공간: 전체 씬이 렌더링될 상대적인 3D 좌표 시스템
- 뷰(시야) 공간: 관찰자(카메라) 시점의 상대적인 3D 좌표 시스템
- 절단(Clip) 공간: -1.0부터 1.0값을 갖는 3D 좌표 시스템
- 화면(screen) 공간: 렌더링이 될 대상(화면)의 상대적인 2D 좌표 시스템
- 탄젠트(tangent) 공간: 노멀 맵핑에 사용됨
빛의 종류
- 점 광원(point light) 형광등, 가로등 같은 광원. 한 점에서 여러 방향으로 빛을 내보낸다. 이러한 빛은 멀리 나가지 못하기 때문에 한계(fall off)가 존재한다.즉, 특정 거리 이후에는 완전히 사라진다.
- 방향 관원(directional light) 태양과 같은 광원. 태양은 점 광원이지만, 지구와 아주 멀리 떨어져 있기 때문에 모든 광선은 평행으로 지구에 도달한다. 광원의 한계가 없어 무한이 뻗어 나간다.
- 면 광원(area light): 베이킹 라이트 맵에만 적용 세가지 광원 중에 물리적인 측면에서 가장 실제와 가까운 빛이다. 하지만 연산량 측면으로 봤을 때 더 비싸다. 복잡한 렌더링 계산 덕분에 연산량은 더욱 많아진다. 유니티는 실시간 면 광원을 지원하지 않는다. 오직 미리 마련해 놓은 베이킹 라이트맵을 통해 사용할 수 있다.
렌더링 방정식
$L_0(x,w_0)=L_Ɛ(x,w_0)+\int_1f(x,w_i\rightarrow w_0)\cdot L_i(x,w_i)\cdot (w_i\cdot n)dw$