Unity 검색

셰이더 프로파일링 및 최적화에 관한 Asa의 팁

아사 리드(Asa Reed)가 알려주는 버텍스 셰이더와 프래그먼트 셰이더 중에서 선택하는 방법, 디버깅 툴, 가장 중요한 최적화 7가지에 관한 팁을 살펴보세요.

버텍스 셰이더 vs. 프래그먼트 셰이더

버텍스 셰이더: 성능을 가장 중요하게 생각한다면 버텍스 셰이더를 선택하세요. 버텍스 셰이더는 메시의 모든 버텍스에서 작동하는 반면, 프래그먼트 셰이더는 이러한 버텍스로 이루어진 트라이앵글 내의 모든 픽셀에서 작동합니다.

버텍스 셰이더의 경우 정확한 조명 데이터를 얻거나 텍스처 매핑을 수행할 수 없는 등 일부 제약이 있습니다. 단, 버텍스 셰이더는 프래그먼트 셰이더와 달리 임의 수준으로 UV 텍스처 좌표를 움직여 애니메이션화한 표면의 효과를 얻는 등의 작업을 수행할 수 있습니다.

Unity-shader-optimization-vertex-shader

버텍스 셰이더로 구현한 모델의 예(버텍스 셰이더와 프래그먼트 셰이더의 예 중).

버텍스 셰이더의 조명 및 표면 효과는 더 빠른 속도로 실행되는 대신, 비주얼 품질 및 정확도가 떨어집니다. 지오메트리(버텍스)를 대상으로 하는 작업(예: GPU 스키닝)은 항상 버텍스 셰이더에서 수행해야 합니다.

프래그먼트 셰이더: 고품질 비주얼 또는 흥미로운 표면 효과를 구현하고자 하며 자연스러우면서도 정확한 조명이 필요하다면 프래그먼트 셰이더를 사용하세요. 프래그먼트 셰이더에 추가하는 요소에 유의하고 이러한 작업을 간소화하도록 노력하거나 작업을 버텍스 셰이더로 옮기세요.

Unity-shader-optimization-vertex-and-fragment-shaders

동일한 모델을 각각 버텍스 셰이더와 프래그먼트 셰이더를 사용하여 구현한 모습(버텍스 셰이더와 프래그먼트 셰이더의 예 중)(버텍스 셰이더와 프래그먼트 셰이더의 예 중).

특히 유니티 내에서 #pragma 정의 또는 셰이더 코드 내에서의 유니티 내장 기능 사용에 유의하세요. 셰이더로 알파 수정 등 간단한 작업을 수정하면 많은 자원이 소모되지 않는다고 생각할 수 있지만, 이 셰이더가 "#pragma surface surf BlinnPhong"를 정의하는 경우 Blinn-Phong 라이팅을 계산하기 위해 수십 가지의 계산이 셰이더에 주입됩니다. 유니티 설치 디렉토리의 lighting.cginc 파일을 확인하여 이러한 라이팅이 정의하는 코드를 보고 추가할 수 있습니다. 자세한 내용을 알아보려면 다음 문서를 참고하세요.표면 셰이더에서의 맞춤 조명 모델.

셰이더 프로파일링

유니티의Frame debugger프레임 디버거(Frame Debugger)를 사용하면 특정 프레임에서 실행 중인 게임 재생을 멈추고 해당 프레임을 렌더링하는 데 사용된 개별 드로우 콜을 볼 수 있습니다. 디버거를 사용하면 드로우 콜 나열 외에도 개별 드로우 콜을 단계별로 살펴보아 장면의 그래픽 요소가 어떻게 구성되었는지 상세하게 확인할 수 있습니다.

Unity-shader-optimization-frame-debugger

유니티의 프레임 디버거

2017.1 버전에는 지오메트리 배칭 정보가 포함되며, 배칭되도록 설정된 메시가 배칭되지 않는 이유에 대한 상세한 피드백도 제공됩니다.

또한 특정 하드웨어의 경우 셰이더 디버깅에 효과적인 다음의 외부 툴도 제공됩니다.

  1. iOS와 Mac OS: Xcode에는 GPU가 특정 프레임에서 사용하는 모든 메모리 캡처 등의 옵션을 포함하는 프레임 프로파일러가 내장되어 있고, 드로잉 코드를 본격적으로 작성할 수 있는 camera.render, 그리고 있는 요소의 중첩된 계층 구조 보기가 가능한 드릴다운 및 각 셰이더가 전체 렌더링 시간에 어떤 영향을 미치는지 보여주는 FPS 탭이 포함됩니다.

    Unity-shader-optimization-xcode_profiler

    Xcode의 프레임 프로파일러.

  2. Pc와 Mac의 경우 RenderDoc과 Intel GPA 툴이 심도 있는 기능을 제공하며 하드웨어 호환성이 가장 뛰어납니다.

  3. ARM Mali와 같은 모바일 칩셋, PS4, Xbox, Nintendo Switch 등 특정한 하드웨어 타겟의 성능이나 잘못된 출력을 디버깅하는 경우 항상 제조사의 자체 프레임 디버거(일부 경우 프레임 프로파일러나 프레임 애널라이저로 불림)를 사용하세요. 대부분의 경우 제조사의 툴은 해당 칩셋에 대한 가장 정확한 데이터를 제공하며, 위에서 언급한 보다 일반적인 툴에 비해 확장된 데이터 세트를 보유합니다.

주요 셰이더 최적화 7가지

프레임 단위에서는 게임 코드보다 셰이더 코드가 수행하는 작업이 훨씬 더 많습니다. 다음의 최적화를 사용하여 성능/FPS 속도를 쾌적하게 유지할 수 있습니다.

  1. 비상수 연산을 최소화하세요. 상수 또는 "dynamic uniforms"(예: x=4/33, x=4xsin(24))를 사용하세요.
  2. 스칼라 값(float, int)을 벡터 값(float3, float4)보다 먼저 곱하세요.
  3. 알파테스트의 경우를 포함하여 가급적 폐기 명령을 지양하세요(주로 모바일에 적용됨). 오버드로우에 유의하세요.
  4. 가능한 한 버텍스 셰이더 내로 계산을 제한하세요.
  5. 벡터 작동이 결과의 모든 구성요소를 사용하지 않는 경우, 가능한 한 벡터 작동에 대한 쓰기 마스크를 지정하세요.
  6. 동적으로 설정된 값/non-uniforms(if-else, loops)에 기반하여 브랜칭을 수행하지 마세요.
  7. 작동(예: discard(), floor() 등)이 렌더러 모델(OpenGL 2, OpenGL 3, OpenGL ES 등)과 하드웨어에 미치는 영향을 확인하세요.
리소스 더 보기

셰이더 관련 문서 및 튜토리얼:

확인

유니티에서는 웹 사이트의 모든 기능을 최대로 이용할 수 있도록 쿠키를 사용합니다. 자세한 정보는 쿠키 정책 페이지를 참조하세요.