쉐이더는 가상 현실을 현실과 유사하게 렌더링하기 위해 사용되어서 대표적으로 생각나는 부분은 게임엔진이다.
그 중에서 내가 주력으로 사용하는 게임 엔진인 유니티에서의 쉐이더의 특징을 알아보도록 하자.
(쉐이더 코드 관련 정보 추가 예정)
0. 유니티 쉐이더의 구조
유니티에서 쉐이더와 메터리얼(material)에 초점을 둔다.
* 셰이더
- 화면에 오브젝트를 렌더링할 때 사용하는 실제 세이더 코드를 담은 에셋.
- 렌더링을 위한 그래픽 파이프라인 설정 정보 + 셰이더의 예상 입력에 대한 메타 정보.
* 메터리얼
- 유니티 고유의 에셋.
- 쉐이더 정보 + 쉐이더의 모든 입력 정보.
- 메터리얼로 설정해서 오브젝트들의 재질을 처리해서 오브젝트마다 별도의 쉐이더 코드를 작성할 필요가 없다.
1. 유니티 셰이더의 기본 코드
사용되는 옵션에 따라 standard, unlit 등 여러 종류의 쉐이더를 설정할 수 있지만 연산을 최소한으로 한 상태를 보기 위해 unlit로 설정하고, 뼈대만 남기면 다음과 같다.
(unlit : 빛 연산을 제외한 옵션)
Shader "Unlit/SolidColor" {
Properties {
_MainTex ("Texture", 2D) = "white" {}
}
SubShader {
Tags{ "RenderType"="Opaque" }
LOD 100
Pass{
CGPROGRAM
ENDCG
}
}
}
- 맨 처음에 쉐이더의 이름/타입을 선언한다.
- Properties : 쉐이더의 유니폼 변수 정의. (유니티 에디터 GUI로 정보를 전달해서 값 변경 가능, 선언은 실제 코드에서 해줘야 함).
- n개의 SubShader : n개의 완전한 쉐이더 코드 + 정보(유니티는 사용자의 하드웨어가 실행가능한 쉐이더를 가진 첫 번째 서브쉐이더 블록을 사용한다. 그러므로 유니티의 유연성의 예시인 여러 플랫폼에 적합한 쉐이더를 가질 수 있다.)
++ SubShader : 쉐이더의 간단한 정보들 모음집