ShaderLab
유니티의 셰이더는 shaderLab이라는 유니티의 독자적인 형식으로 외곽을 기술해 주로 OpenGL ES의 내부 상태를 설정한다. 그리고 그 안쪽에 GPU에 전달하는 셰이더 본문으로서 각종 셰이딩 언어로 기술한 버택스 셰이더와 프로그래먼트 셰이더를 집어넣는다. 다음은 가장 기본적인 셰이더 구문이다.
Shader "Simple colored lighting"
{
Properties {
_Color ("Main Color", Color) = (1,.5,.5,1)
}
SubShader
{
Pass
{
Material
{
Diffuse [_Color]
}
Lighting On
}
}
FailBack "Diffuse"
}
Shader 뒤에 슬래시가 들어간 이름을 넣어두면, 머터리얼에 셰이더를 설정할 때 카테고리로 분류되어 선택할 수 있다.
Properties에는 인스펙터에서 사용자가 조정할 수 있는 셰이더 입력 매개변수를 프로퍼티로서 기술한다.
SubShader 블록은 여러 개 만들 수 있고, 유니티가 위에서부터 실행하다가 그 플랫폼에서 실행할 수 있는 셰이더를 선택하므로, 복수 플랫폼을 대상으로 셰이더를 나누어 기술해 둘 수 있다. 어느 SubShader도 제대로 동작하지 않을 때는 FailBack에 지정된 Diffuse라는 가장 기본적인 셰이더가 적용된다. Pass는 1회의 렌더링 파이프라인 통과를 나타낸다. 같은 오브젝트를 여러 번 렌더링하는 멀티 패스 셰이더를 만들고 싶을 때는 Pass 블록을 여러 개 만든다.
외부 도구 및 WebGL
셰이더 편집 후에 GLSL 문법에 오류가 있을 경우, 유니티의 Console에는 단순히 셰이더 프로그램의 링크 오류를 알리는 메시지만 표시되어, 오류의 원인을 찾기에는 충분하지 않다. 이때 GLSL이라는 표준 규격을 사용하는 이점을 살려, 유니티 외부에서 GLSL을 사용할 수 있는 도구를 소개한다.
원래는 셰이더를 디버거로 스텝 실행할 수 있으면 나무랄 데가 없지만, 아지까지는 일반적인 게임앱 개발 용도로는 구할 수 없다. 대신 우선은 단순히 오류 메시지를 더 자세히 보기 위한 방법으로 PVRShaderEditor를 사용해볼 수 있다. PVRShaderEditor는 Imagination Technologies의 웹사이트에서 PowerVR Tools & SDK의 일부로 다운로드 할 수 있다.
셰이더의 구문 오류를 표시하고, 또한 디스어셈블 결과와 프로파일링 결과가 표시되어, 그 셰이더를 실제로 실행했을 때 GPU가 몇 사이클을 소비하는지 실행 성능을 어림잡아 산정할 수 있으므로, 예를 들어 느린 pow 내장함수를 근사식으로 치환하면 어느 정도 빨라지는 등을 파악해 최적화를 시도할 수 있다.
단 PVRShaderEditor는 gl_ModelViewProjectionMatrix 등의 변수를 정의하지 않으므로, 유니티용으로 기술한 버텍스 셰이더를 그대로 붙여넣으면 오류가 발생한다. 또한 gl_ 이 앞에 붙는 변수는 예약되어 있어 새로 정의할 수 없으므로, glt_ 등 다른 접두사로 치환해 선언해주면 컴파일을 통과한다.