Unity의 렌더링 파이프라인
대체 셰이더로 렌더링(Rendering with Replaced Shaders)

셰이더 작성 시 성능 팁(Performance tips when writing shaders)

필요한 부분만 연산

셰이더 코드가 수행해야 하는 연산과 프로세스가 많을수록 게임의 성능에 더 많은 영향을 끼칩니다. 예를 들어, 컬러당 머티리얼을 지원하면 셰이더가 더 유연해질 수는 있겠지만 해당 컬러가 흰색으로 설정된 상태로 유지될 경우 화면에 렌더링되는 버텍스 또는 픽셀마다 불필요한 연산이 수행됩니다.

계산의 빈도도 게임의 성능에 영향을 끼칩니다. 보통 버텍스(버텍스 셰이더 실행) 수에 비해 훨씬 많은 픽셀이 렌더링되고(픽셀 셰이더 실행도 많으며) 오브젝트보다 많은 버텍스가 렌더링됩니다. 가능하다면 계산을 픽셀 셰이더 코드에서 버텍스 셰이더 코드로 옮기거나 셰이더에서 완전히 없애고 스크립트에 값을 설정해야 합니다.

표면 셰이더(Surface Shaders) 최적화

표면 셰이더는 조명과 상호작용하는 셰이더를 작성할 때 적합합니다. 그러나 표면 셰이더의 디폴트 옵션은 일반적인 경우를 전반적으로 다루도록 조정되어 있습니다. 이를 미세조정하여 특정 상황에 맞게 셰이더 속도를 높이거나 최소한 크기를 줄일 수 있습니다.

  • 셰이더용 approxview 지시자(뷰 방향, 즉 스페큘러에 사용)는 뷰 방향을 픽셀당이 아닌 버텍스당으로 정규화합니다. 이 값은 추정값이지만 대부분의 경우 충분히 사용할 만합니다.
  • 스페큘러 셰이더 타입용 halfasview는 더 빠릅니다. 반 벡터(조명 방향과 뷰 벡터 사이의 중간)는 버텍스당 계산되고 정규화되며, 조명 함수는 뷰 벡터 대신 반 벡터를 파라미터로 받게 됩니다.
  • noforwardadd를 사용하면 셰이더가 포워드 렌더링에서만 단방향광을 완전히 지원합니다. 그 외의 광원은 버텍스당 광원 또는 구면 하모닉스로써 여전히 효력이 있습니다. 이를 통해 셰이더 크기를 줄일 수 있고 여러 광원이 존재하더라도 셰이더가 하나의 패스로 렌더링하도록 해 줍니다.
  • noambient는 셰이더에서 주변광과 구면 조화 광원을 비활성화하면 성능이 약간 빨라집니다.

연산 정밀도

셰이더를 Cg/HLSL로 작성할 경우 float, half, fixed의 3가지 기본 숫자 타입이 있습니다. 데이터 타입 및 정밀도 페이지를 참조하십시오.

성능을 위해서는 가능한 한 가장 낮은 정밀도를 사용합니다. 특히 iOS 및 Android와 같은 모바일 플랫폼에서 중요하며, 다음을 추천합니다.

  • 월드 공간 포지션 및 텍스처 좌표에는 float 정밀도를 사용해야 합니다.
  • 그 외 항목 (벡터, HDR 컬러 등)은 half 정밀도로 시작합니다. 필요한 경우에만 정밀도를 높입니다.
  • 텍스처 데이터의 아주 간단한 연산의 경우 fixed 정밀도를 사용합니다.

실제로는 정확히 어떤 숫자 타입을 사용할 것이냐는 플랫폼과 GPU에 따라서 달라집니다. 일반적으로는 다음과 같습니다.

  • 최신 데스크톱 GPU는 언제나 완전한 float 정밀도로 모든 계산을 수행하며 그 결과 float/half/fixed는 결국 실질적으로 동일해집니다. 따라서 테스트가 다소 힘들 수 있는데 PC에서는 float/half/fixed 정밀도가 정말 충분한지 알기 어렵기 때문입니다. 정확한 결과를 위해서는 언제나 타겟 디바이스에서 셰이더를 테스트해야 합니다.
  • 모바일 GPU는 실제로 half 정밀도를 지원합니다. 이를 통해 일반적인 경우 더 빠르고 더 적은 전력을 사용하여 계산을 수행합니다.
  • Fixed 정밀도는 일반적으로 구형 모바일 GPU에서만 유용합니다. 대부분의(OpenGL ES 3 또는 Metal을 지원하는) 최신 GPU는 내부적으로 fixedhalf 정밀도를 완전히 동일하게 다룹니다.

자세한 내용은 데이터 타입 및 정밀도를 참조하십시오.

알파 테스팅(Alpha Testing)

고정 함수 AlphaTest 또는 같은 기능을 하는 프로그래밍 가능한 clip()은 플랫폼에 따라 다른 성능 특성을 보입니다.

  • 일반적으로 대부분의 플랫폼에서 완전히 투명한 픽셀을 제거할 때 사용하면 약간의 이점이 있습니다.
  • 그러나 iOS 및 일부 Android 디바이스의 PowerVR GPU에서는 알파 테스트에 리소스가 많이 사용됩니다. 이러한 플랫폼에서 성능 최적화용으로 사용할 경우 게임 속도는 더욱 느려집니다.

컬러 마스크(Color Mask)

일부 플랫폼(iOS 및 Android 디바이스 대부분의 모바일 GPU)에서는 ColorMask를 사용하여 채널을 제외하는 작업(ColorMask RGB)에는 리소스가 많이 사용되로 꼭 필요할 경우에만 사용합니다.

Unity의 렌더링 파이프라인
대체 셰이더로 렌더링(Rendering with Replaced Shaders)