본문 바로가기

유니티/셰이더 및 VFX

[Unity] 셰이더 코드 (1) - 셰이더 언어 (Cg, GLSL and HLSL)

반응형

유니티에서의 셰이더

게임 엔진에서 셰이더를 다룬다는 것은 멋진 일이다.

그러나 셰이더를 배우고 활용하기란 쉽지가 않다.

많은 사전 지식을 요구하기 때문인 것도 있겠으나 가독성 좋은 한글 자료 또한 부족하기 때문일 것이다.

앞으로의 포스팅을 통해 셰이더를 코드로 다루는 방법을 기술하고자 한다.


셰이더 코드란?

대부분의 게임엔진과 DCC툴에서는 셰이더를 노드 형태로 많이 제공한다.

그 이유는 서론에서 언급한 전문성 때문이고, 셰이더를 다루는 아티스트들에게는 이러한 전문성이 진입장벽이 되기 때문이다.

그렇다면 셰이더를 노드 형태로 다룰 줄만 안다면 그래픽스는 해결이 되는 것일까?

 

사실 대부분의 문제점은 해결이 된다고 본다.

그러나 셰이더의 최적화 문제라던지 깊이 있는 셰이더 구현은 코드로만 가능하기 때문에 전문적인 셰이더 구현을 위해서는 코드를 사용해야 한다.


셰이더 코드의 종류

우리가 유니티에서 C#이라는 언어를 이용해서 코드를 작성하듯이 셰이더 역시 셰이더 언어를 사용한다.

그런데 C#과는 다르게 셰이더 언어는 여러 개가 사용이 되는데, 종류는 아래와 같다.

 

  • HLSL (High-Level Shading Language)
  • GLSL (OpenGL Shading Language)
  • Cg
  • ShaderLab

언어를 하나로 통일하면 되는데 뭐 하러 이렇게 여러 개를 만들어둔 것일까?

 

그 이유는 유니티가 멀티플랫폼을 지원하기 때문이다.

모바일을 타깃 플랫폼으로 할 것이냐 PC를 타켓 플랫폼으로 할 것이냐에 따라 해당 디바이스에서 사용되는 그래픽 라이브러리가 달라지고, 이에 따라 필요한 그래픽스 API도 달라지기 때문에 여러 개의 셰이더 언어를 가지게 되었다.

 

또한 그래픽스 API가 발전함에 따라 사용되지 않는 셰이더 언어가 Legacy로 바뀌기도 한다. Cg의 경우 이제는 Legacy가 되었으며 앞으로는 주로 HLSL을 사용한다. 하지만 기존에 사용되던 Cg를 모두 없애버릴 수 없기 때문에 셰이더 언어로 남겨두었다.


셰이더 언어별 특징

HLSL  (High-Level Shading Language)

  • 크로스 컴파일 지원 (OpenGL, Vulkan, Metal 등 대부분의 플랫폼에서 크로스 컴파일 가능)
  • Microsoft 플랫폼에서 사용하기 위해 탄생된 언어
  • DirectX에서 사용되는 고수준 셰이딩 언어
  • 2019년부터 유니티의 기본 셰이더 언어로 사용

GLSL  (OpenGL Shading Language)

  • 크로스 컴파일 지원 (OpenGL 또는 OpenGLES 플랫폼에서만 실행)
  • OpenGL API에서 사용되는 셰이딩 언어

Cg

  • 초반 유니티 셰이더 코드에서 사용되던 셰이딩 언어. 빌트인 파이프라인을 비롯해 구버전의 셰이더는 대부분 Cg로 제작 (Unity5 버전까지 주로 사용되던 언어)
  • Nvidia에서 개발한 그래픽스 프로그래밍 언어
  • 크로스 컴파일 지원

ShaderLab

  • 유니티 전용언어로, 셰이더 프로퍼티와 구조를 보다 간편하게 작성하게 해주는 역할
  • 주로 HLSL과 함께 사용되며 여러 가지 셰이더 기능을 오버라이드 할 수 있게 제공
  • 하나의 파일에서 다양한 셰이더 언어를 사용할 수 있도록 캐스케이딩 시스템 제공
  • 유니티 에디터, C# 스크립트 등이 셰이더와 소통 가능하게 하는 역할

이렇듯 앞으로의 유니티에서 제공하는 셰이더 언어는 HLSL이고, 우리는 ShaderLab을 사용하여 HLSL 셰이더 코드를 작성하면 된다.

 

(코드 작성 방법은 다음 포스팅부터 계속됩니다.)

반응형