Shaders

유니티의 모든 렌더링은 Shaders로 이루어집니다. 쉐이더는 그래픽 하드웨어가 렌더링을 위해 어떻게 셋업되는지 설정하게 해주는 스크립트 입니다. 유니티는 60개가 넘는 내장된 쉐이더를 가지고 있는데 사용자가 그들을 확장할 수도 있습니다. 그 내장된 쉐이더는 내장 셰이더(Built-in Shader) 가이드에 문서화 되어있습니다.

유니티에서 쉐이더는 세가지 방법으로 만들어 질수 있습니다:

  • _표면(Surface) 쉐이더_ 가 가장 좋은 방법일 것입니다. 쉐이더가 빛, 그림자, 프로젝터 등과 상호작용할 필요가 있다면 표면 쉐이더를 사용하세요. 표면 쉐이더는 또한 복잡한 쉐이더를 간단한 방법으로 만들수 있게 해주는데 이것은 추상화의 높은 레벨 입니다. 대부분의 표면 쉐이더에서 빛은 연기되는 형태(사용자 정의된 빛모델에서는 예외가 있음)로 계산되는데 이것은 쉐이더가 여러 빛과 효율적으로 상호작용하는 것을 가능하게합니다. 몇줄의 _Cg/HLSL_ 로 쉐이더를 작성할수 있으며 더 많은 양의 코드가 그것에서 자동 생성됩니다.
  • _꼭지점과 조각 쉐이더_ 는 사용자가 표면 쉐이더가 다룰 수 없는 색다른 효과를 내고 싶을 때, 쉐이더가 빛과 상호작용할 필요가 없을 때, 또는 이미지 효과를 낼 때 필요한 쉐이더 입니다. 이런 방법으로 만들어진 쉐이더는 필요한 효과를 만드는데 가장 유연한 방법(표면 쉐이더도 자동으로 수많은 꼭지점과 조각 쉐이더로 전환됩니다)이지만 대가를 치루어야 하는데 더 많은 코드를 만들어야하며 빛과 상호작용하기가 까다롭습니다. 이 쉐이더도 _Cg/HLSL_로 쓰여집니다.
  • _고정 기능 쉐이더_는 프로그래밍 쉐이더를 지원하지 않는 오래된 하드웨어에 필요합니다. 사용자의 게임이 오래된 하드웨어나 간단한 모바일 플랫폼에서 실행될 때 게임이 무언가 감지가능한 것을 렌더링하게 하기위해서 이 고정 기능 쉐이더가 다른 쉐이더를 대체하기 위한 수단으로 사용될수 있습니다. 이 쉐이더는 Microsoft의 .FX파일이나 NVIDIA의 CgFX와 비슷한 _ShaderLab_이라는 언어로만 만들어집니다.

어떤 타입을 선택하던 쉐이더 코드의 상당 부분은 쉐이더 구조를 정리하는ShaderLab으로 변환됩니다. 이것은 아래와 같습니다:

Shader "MyShader" {
    Properties {
        _MyTexture ("My Texture", 2D) = "white" { }
        // other properties like colors or vectors go here as well
    }
    SubShader {
        // here goes the 'meat' of your
        //  - surface shader or
        //  - vertex and fragment shader or
        //  - fixed function shader
    }
    SubShader {
        // here goes a simpler version of the SubShader above that can run on older graphics cards
    }
} 

ShaderLab reference에서 ShaderLab문법의 기본적인 개념을 읽고 아래에 있는 튜토리얼을 해보기를 권합니다.

튜토리얼에는 다른 종류의 쉐이더를 위한 많은 예제가 있습니다. 특히 표면 쉐이더의 더 많은 예제를 위해서는 Resources section에서 유니티 내장 쉐이더의 소스코드를 볼 수 있습니다. 유니티의 Image Effects 패키지는 많은 흥미있는 꼭지점과 조각 쉐이더를 포함하고 있습니다.

쉐이더의 개요를 읽고 shader reference도 확인하세요!

역링크