본문 바로가기

유니티/셰이더 및 VFX

[Unity] 셰이더란 무엇인가?

반응형

셰이더의 의미

일반적으로 셰이더(Shader)는 GPU에서 실행되는 프로세스를 의미한다.

하지만 유니티나 언리얼등의 엔진에서는 주로 그래픽스와 관련된 작업을 수행한다고 알려져 있다.

유니티에서는 셰이더가 어떻게 사용되고 있을까?


유니티에서의 셰이더 사용

어떻게 사용되는지에 대해 알기 전에 셰이더가 단순히 그래픽과 관련된 역할만 하는 것이 아니라는 것을 알아야 한다.

셰이더는 위에서 언급된 것처럼 GPU에서 실행되는 프로그램이고, GPU가 그래픽과 관련된 처리를 주로 하기 때문에 그래픽스와 필수불가결한 존재로 인식하고 있지만 사실 셰이더는 다른 역할도 한다.

 

GPU는 CPU에 비해 상대적으로 가볍지만 많은 병렬처리를 하는데 효과적이다. 이러한 강점을 사용하도록 설계된 스크립팅 언어가 Compute Shader이다. 이 셰이더는 그래픽과는 관련 없이 GPU에서 계산을 처리하도록 도와준다.

 

따라서 위의 Compute Shader를 포함하여 현재 유니티에서는 크게 다음과 같은 3가지 유형으로 셰이더를 사용하고 있다.

  • 그래픽스 셰이더
  • 레이트레이싱 셰이더
  • 컴퓨트 셰이더

 

그래픽스 셰이더는 흔히 우리가 알고 있는 렌더링 파이프라인에 해당하는 셰이더이다. 우리가 직접으로 렌더링 방식에 영향을 줄 수 있는 부분이 이 부분이며 유니티에서는 셰이더 오브젝트를 사용하여 작업하게 된다.

 

레이트레이싱 셰이더는 레이트레이싱을 사용하여 다양한 효과를 줄 때 사용한다. 유니티에서 API를 제공하고 있으며 빛의 반사, 굴절, 그림자, GI, AO등과 관련된 많은 기능을 제작 및 변형할 수 있다.

 

컴퓨트 셰이더는 병렬 프로세스를 GPU에서 효율적으로 사용하도록 해준다. 렌더링 파이프라인에서 화면의 픽셀 정보들에 관한 처리를 했다면 컴퓨트 셰이더는 이를 픽셀이 아닌 다른 정보의 연산에 활용한 것이다.


그래픽스 셰이더는 어떻게 만들 수 있을까?

유니티는 2가지의 방법을 제공한다.

첫 번째는 셰이더 스크립팅(셰이더 언어)이고 두 번째는 셰이더 그래프이다.

셰이더 스크립팅에는 HLSLShaderLab이 있으며 셰이더 그래프는 노드기반으로 제작하게 해 준다.

 

유니티는 왜 작성방식을 두 가지로 나누어 두었을까?


스크립팅 방식과 그래프 방식의 차이점

셰이더 언어(Cg/HLSL과 ShaderLab)를 사용한 방식은 높은 프로그래밍 역량을 요구한다는 것이 큰 문제점이었다.

따라서 프로그래머가 아닌 아티스트들도 직접 셰이더 제작을 할 수 있는 도구가 필요했는데 그것이 셰이더 그래프이다.

 

두 방식은 간단히 사용하기엔 같은 결과물을 도출해내지만 분명한 장단점이 존재한다.

 

셰이더 그래프를 사용한 제작방식은 노드기반이기 때문에 직관적인 제작이 가능하다.

중간중간의 결과를 노드를 통해 확인(실시간 디버깅)할 수 있으며 비프로그래머도 작업이 가능하다. 경우에 따라서는 셰이더 언어를 사용한 제작방식보다 작업속도가 더 빠르다.

 

반면 스크립팅 방식에 비해 유연성이 떨어진다. 최적화가 어려우며 테셀레이션 같은 버텍스 기반의 셰이더 처리는 할 수가 없다.

반응형