Unity HLSL 셰이더 데이터 타입 및 정밀도
이 문서는 Unity에서 HLSL(Higher Level Shading Language)과 관련하여 데이터 타입 및 정밀도에 대해 설명합니다. 여러 플랫폼에서 최적의 성능을 내기 위한 데이터 타입의 선택이 중요한데, 이를 이해하고 활용하는 것이 중요합니다.
기본 데이터 타입
Unity에서 지원하는 주요 데이터 타입은 다음과 같습니다:
| 데이터 타입 | 설명 |
|---|---|
| float | 고정밀도의 부동 소수점 데이터 타입으로, 일반적으로 32비트입니다. |
| half | 중정밀도의 부동 소수점 데이터 타입으로, 16비트입니다. 성능 개선을 위해 사용됩니다. |
| fixed | 저정밀도의 데이터 타입, 일반적으로 11비트입니다. OpenGL ES 2.0에서만 지원됩니다. |
정밀도 비교
- 고정밀도 (float): 실세계 좌표나 텍스처 좌표와 같은 정밀도가 중요한 계산에 사용합니다.
- 중정밀도 (half): 방향 벡터나 색상 같은 비교적 정밀도가 덜 중요한 계산에 적합합니다.
- 저정밀도 (fixed): 그래픽 성능이 중요한 경우 사용되며, 특히 저항력 있는 모바일 장치에서 유용합니다.
부동 소수점 숫자 사용
부동 소수점 숫자는 성능과 메모리 사용에 영향을 미칩니다. Unity의 셰이더 컴파일러가 접미사를 무시하기 때문에, 접미사 없이 직접 정의하는 것이 효율적입니다.
예제
다음은 부동 소수점 계산 방식의 예입니다.
half3 packedNormal = ...;
half3 normal = packedNormal * half(2.0) - half(1.0);
이 코드에서는 half 타입을 이용하여 성능을 최적화합니다.
정수 데이터 타입
정수 데이터 타입은 주로 루프 카운터나 배열 인덱스로 사용됩니다. GPU마다 지원되는 정수 타입이 다를 수 있으므로, 타겟 플랫폼을 고려해야 합니다.
벡터/매트릭스 타입
HLSL에서는 다양한 벡터 및 매트릭스 타입을 제공합니다. 이러한 타입들은 기본 데이터 타입을 기반으로 만들어집니다.
| 데이터 타입 | 설명 |
|---|---|
| float3 | 3D 벡터 |
| float4 | 4D 벡터 |
| float4x4 | 4x4 변환 매트릭스 |
예제
float4 myColor = ...;
float redValue = myColor.r;
이 코드는 색상 벡터에서 빨간색 값만 추출합니다.
텍스처/샘플러 타입
HLSL 코드에서는 일반적으로 텍스처를 다음과 같이 선언합니다.
sampler2D _MainTex;
samplerCUBE _Cubemap;
모바일 플랫폼의 경우, 저정밀도 샘플러로 변환되어 메모리 효율성을 높일 수 있습니다.
성능 및 하드웨어 지원
각 플랫폼의 GPU는 부동 소수점 데이터 타입에 대한 지원이 다릅니다. 다음은 대표적인 모바일 GPU에서 지원되는 데이터 타입의 예시입니다.
| GPU 제품군 | float | half | fixed |
|---|---|---|---|
| PowerVR Series 6 | 32 | 16 | 16 |
| Qualcomm Adreno | 32 | 16 | 16 |
| ARM Mali | 32 | 16 | 16 |
성능 팁
- 모바일 환경에서는
half및fixed타입 사용을 권장합니다. - 필요한 경우에만 정밀도를 높일 것을 권장합니다.
결론
Unity에서 HLSL 데이터 타입과 정밀도를 이해하고 적절한 타입을 선택하는 것은 중요합니다. 이를 통해 성능을 최적화하고 메모리 사용량을 줄일 수 있습니다. 더 나은 결과를 얻기 위해 각 타입의 특성을 잘 이해하고 활용해야 합니다.