Version: Unity 6.0 (6000.0)
언어 : 한국어
여러 그래픽스 API를 위한 셰이더 작성
HLSL에서 셰이더 컴파일러에 정보 전달

셰이더에서 16비트 정밀도 사용

기본적으로 GPU는 32비트 정밀도를 사용합니다. GPU 계산 시 16비트 정밀도를 대신 사용할 수 있으며, 모바일 플랫폼에서 다음과 같은 이점이 있습니다.

  • 셰이더가 메모리, 대역폭, 전력을 더 적게 사용합니다.
  • 계산 속도가 더 빨라집니다. 비트를 적게 사용하면 GPU가 등록을 할당하는 방법을 개선할 수 있습니다.

16비트 변수 생성

셰이더에서 16비트 정밀도를 사용하려면 스칼라, 벡터 또는 매트릭스를 선언할 때 half를 사용합니다. 예시:

half _Glossiness;
half4 _Color;
half4x4 _Matrix;

텍스처 샘플러에서 16비트 정밀도를 사용하려면 이를 선언할 때 _half를 추가합니다. 예시:

Texture2D<half4> _MainTex;

16비트 정밀도는 일부 셰이더 계산에 충분하지 않을 수 있습니다. 이렇게 하면 컬러 밴딩 현상이나 불안정한 지오메트리와 같이 눈에 띄는 오류가 발생할 수 있습니다. 오류를 확인하려면 half를 지원하는 플랫폼에서 프로젝트를 실행합니다. 오류가 있는 경우 대신 float를 사용합니다.

half 변수는 크기와 정렬이 32비트인 버퍼에 저장됩니다.

더 많은 플랫폼에서 16비트 값 사용

기본적으로 half는 MacOS를 사용하는 플랫폼과 같이 Unity의 고성능 플랫폼에 영향을 미치지 않습니다. half 변수는 float가 되고 GPU는 계산에 32비트 값을 사용합니다.

16비트 정밀도를 더 많은 플랫폼에서 사용하려면 Edit > Project Settings > Player로 이동하여 Shader Precision ModelUniform으로 설정합니다. 그러면 Unity는 HLSL 코드의 half를 다음과 같이 취급합니다.

  • 스칼라의 경우 min16float
  • 텍스처 샘플러의 경우 float

Unity가 셰이더를 컴파일할 때 min16float는 지원되는 경우 GPU가 계산에 16비트 정밀도를 사용할 수 있는 플랫폼 데이터 형식이 됩니다. 예시:

  • DirectX 11 또는 12를 사용하는 경우 변수는 min16float로 유지됩니다.
  • OpenGL을 사용하는 경우 변수는 mediump가 됩니다.
  • Vulkan을 사용하면 변수는 RelaxedPrecision 플로트가 됩니다.
  • Metal을 사용하는 경우 변수는 float가 되지만 GPU는 계산에 16비트 값을 사용합니다.

텍스처에 대한 Shader Precision Model 설정을 오버라이드하려면 텍스처 샘플러를 선언할 때 _half를 추가합니다. 예시: Texture2D<half4> _MainTex.

추가 리소스

여러 그래픽스 API를 위한 셰이더 작성
HLSL에서 셰이더 컴파일러에 정보 전달
Copyright © 2023 Unity Technologies
优美缔软件(上海)有限公司 版权所有
"Unity"、Unity 徽标及其他 Unity 商标是 Unity Technologies 或其附属机构在美国及其他地区的商标或注册商标。其他名称或品牌是其各自所有者的商标。
公安部备案号:
31010902002961