Unity/ 셰이더/ 기본 작성법

셰이더란

프로그래머가 자신이 원하는 그래픽 효과를 구현하기 위해 GPU에게 명령하는 것. GPU는 그래픽 데이터를 처리하는 파이프라인 중간에 프로그래머의 명령을 받아 효과를 반영한다.

셰이더의 종류 자체는 여러가지인데 유니티에서는 Fixed Function Shader, Vertex-Fragment Shader, Surface Shader를 많이 사용한다. –이 외에 Geometry Shader 같은 것도 있지만 잘 쓰이지 않으니 생략.

셰이더를 작성하는 언어도 여러가지인데, OpenGL에서 사용하는 GLSL과 DirectX에서 사용하는 HLSL, NVIDIA에서 개발한 CG 등이 있다. 유니티에서는 보통 CG를 이용하여 작성하는데, CG가 OpenGL과 DirectX 모두 호환되기 때문.

Unity에서의 작성법

유니티의 셰이더는 아래와 같은 구조로 작성된다.

Shader "경로/쉐이더 이름 " {
        Properties {
                // 프로퍼티
        }
        SubShader {
                Pass {
                        // 코드
                }
        }
        Fallback "Diffuse"
}

셰이더 코드의 첫 줄에는 작성되는 셰이더 파일의 이름과 경로를 작성한다. 여기에 작성된 경로와 이름은 Material에서 셰이더를 적용할 때 사용된다.

프로퍼티에는 SubShader 블록에서 사용하는 변수를 등록하는데, 여기에 등록된 변수는 유니티 에디터 상에서 값을 제어할 수 있다.

SubShader 블록은 실제 셰이더 코드가 작성되는 부분이다. 유니티 상에서는 SubShader를 각 기기(Device)에 대응하는 용도로 구분하는데, 기기의 성능에 따라 다른 셰이더를 구성해야 한다면 아래와 같이 SubShader를 여러개 만들면 된다.

Shader "쉐이더 이름 " {
        Properties {
                // 프로퍼티
        }
        // A급 디바이스용
        SubShader {
                Pass {
                        // 코드
                }
        }
        // B급 디바이스용
        SubShader {
                Pass {
                        // 코드
                }
        }
        // C급 디바이스용
        SubShader {
                Pass {
                        // 코드
                }
        }
        Fallback "Diffuse"
}

만일 모든 SubShader를 찾아도 현재 기기에 적용할 수 있는 셰이더가 없다면 맨 마지막의 Fallback 에 지정된 셰이더가 사용된다. 어느 기기에서도 동작할 수 있는 셰이더를 써야 하므로 보통은 Diffuse를 쓴다.

SubShader 안에 Pass는 물체를 한 번 그리는 사이클 정도의 의미로, 만일 하나의 물체에 대해 여러 번 덧칠을 해야 한다는 경우라면 아래와 같이 Pass를 여러번 작성한다. 이런 경우를 두고 멀티 패스라고 한다.

Shader "쉐이더 이름 " {
        Properties {
                // 프로퍼티
        }
        SubShader {
                Pass {
                        // 코드 1
                }
                Pass {
                        // 코드 2
                }
        }
        Fallback "Diffuse"
}

Surface Shader는 Pass 블록 안에 코드를 작성하지 않으므로 주의.

참고 자료

[ssba]

The author

지성을 추구하는 디자이너/ suyeongpark@abyne.com

댓글 남기기