다음 섹션에서는 Direct3D가 데이터 형식 간의 변환을 처리하는 방법을 설명합니다.
데이터 형식 용어
다음 용어 집합은 이후에 다양한 형식 변환의 특징을 지정하는 데 사용됩니다.
학기 | 정의 |
---|---|
SNORM | 부호 있는 정규화된 정수입니다. 즉, n비트 2의 보수 수에 대해 최대값은 1.0f(예: 5비트 값 01111이 1.0f에 매핑됨)를 의미하고, 최소값은 -1.0f(예: 5비트 값 10000이 -1.0f에 매핑됨)를 의미합니다. 또한 두 번째 최소 숫자는 -1.0f에 매핑됩니다(예: 5비트 값 10001은 -1.0f에 매핑됨). 따라서 -1.0f에 대한 두 개의 정수 표현이 있습니다. 0.0f에 대한 단일 표현과 1.0f에 대한 단일 표현이 있습니다. 이렇게 하면 범위에서 균등하게 간격이 조정된 부동 소수점 값에 대한 정수 표현 집합이 생성됩니다(-1.0f... 0.0f) 및 범위의 숫자에 대한 상호 보완적인 표현 집합(0.0f... 1.0f) |
UNORM | 부호 없는 정규화된 정수입니다. 즉, n비트 숫자의 경우 모든 0은 0.0f를 의미하고 모든 1은 1.0f를 의미합니다. 0.0f에서 1.0f까지 균등하게 간격이 지정된 부동 소수점 값의 시퀀스가 표시됩니다. 예를 들어 2비트 UNORM은 0.0f, 1/3, 2/3 및 1.0f를 나타냅니다. |
SINT | 부인 정수입니다. 2의 보수 정수입니다. 예를 들어 3비트 SINT는 정수 값 -4, -3, -2, -1, 0, 1, 2, 3을 나타냅니다. |
UINT | 부호 없는 정수입니다. 예를 들어 3비트 UINT는 정수 값 0, 1, 2, 3, 4, 5, 6, 7을 나타냅니다. |
뜨다 | Direct3D에서 정의한 표현의 부동 소수점 값입니다. |
SRGB | UNORM과 마찬가지로 n비트 숫자의 경우 모든 0은 0.0f를 의미하고 모든 1은 1.0f를 의미합니다. 그러나 UNORM과 달리 SRGB에서는 모든 0에서 모든 1 사이의 부호 없는 정수 인코딩 시퀀스가 0.0f에서 1.0f 사이의 부동 소수점 해석에서 비선형 진행을 나타냅니다. 대개 이 비선형 진행 SRGB가 색 시퀀스로 표시되는 경우 "평균" 보기 조건 하에서 "평균" 디스플레이에서 "평균" 관찰자에 대한 광도 수준의 선형 램프로 표시됩니다. 자세한 내용은 IEC(국제 전기 기술 위원회)에서 SRGB 색 표준 IEC 61996-2-1을 참조하세요. |
부동 소수점 변환
부동 소수점 이외의 표현을 포함하여 서로 다른 표현 간의 부동 소수점 변환이 발생할 때마다 다음 규칙이 적용됩니다.
상위 범위 표현에서 하위 범위 표현으로 변환
- 라운드 투 0은 다른 float 형식으로 변환하는 동안 사용됩니다. 대상이 정수 또는 고정 소수점 형식인 경우 FLOAT에서 SNORM으로의 가장 가까운 반올림 동작, FLOAT에서 UNORM으로의 FLOAT 또는 FLOAT에서 SRGB로의 변환과 같은 다른 반올림 동작을 사용하는 것으로 명시적으로 문서화되지 않는 한 가장 가까운 짝수로 반올림이 사용됩니다. 다른 예외는 ftoi 및 ftou 셰이더 명령입니다. 이 명령은 0으로 반올림됩니다. 마지막으로, 텍스처 샘플러 및 래스터라이저에서 사용되는 부동 고정 변환은 무한정 정확한 이상에서 단위Last-Place 측정된 지정된 허용 오차를 갖습니다.
- 하위 범위 대상 형식의 동적 범위보다 큰 원본 값(예: 큰 32비트 부동 소수점 값이 16비트 float RenderTarget으로 기록됨)의 경우 부호 있는 무한대를 포함하지 않고(위에서 설명한 0으로 반올림) 최대 표현 가능(적절하게 부호 있는) 값 결과입니다.
- NaN 표현이 하위 범위 형식에 있는 경우 더 높은 범위 형식의 NaN은 낮은 범위 형식의 NaN 표현으로 변환됩니다. 하위 형식에 NaN 표현이 없으면 결과는 0이 됩니다.
- 더 높은 범위 형식의 INF는 사용 가능한 경우 하위 범위 형식으로 INF로 변환됩니다. 하위 형식에 INF 표현이 없으면 표현 가능한 최대값으로 변환됩니다. 대상 형식으로 사용할 수 있는 경우 기호가 유지됩니다.
- 하위 범위 형식에서 사용할 수 있고 변환이 가능한 경우 더 높은 범위 형식의 Denorm은 하위 범위 형식의 Denorm 표현으로 변환되고, 그렇지 않으면 결과는 0입니다. 대상 형식으로 사용할 수 있는 경우 부호 비트가 유지됩니다.
하위 범위 표현에서 상위 범위 표현으로 변환
- 하위 범위 형식의 NaN은 더 높은 범위 형식으로 사용할 수 있는 경우 더 높은 범위 형식의 NaN 표현으로 변환됩니다. 상위 범위 형식에 NaN 표현이 없으면 0으로 변환됩니다.
- 하위 범위 형식의 INF는 더 높은 범위 형식으로 사용할 수 있는 경우 더 높은 범위 형식의 INF 표현으로 변환됩니다. 더 높은 형식에 INF 표현이 없으면 표현 가능한 최대 값(해당 형식의 MAX_FLOAT)으로 변환됩니다. 대상 형식으로 사용할 수 있는 경우 기호가 유지됩니다.
- 낮은 범위 형식의 Denorm은 가능하면 더 높은 범위 형식의 정규화된 표현으로 변환되고, 그렇지 않으면 Denorm 표현이 있는 경우 더 높은 범위 형식의 Denorm 표현으로 변환됩니다. 이러한 값이 실패하면 상위 범위 형식에 Denorm 표현이 없으면 0으로 변환됩니다. 대상 형식으로 사용할 수 있는 경우 기호가 유지됩니다. 32비트 부동 소수점 번호는 Denorm 표현이 없는 형식으로 계산됩니다(32비트 부동 소수점에서 작업 중인 Denorms가 유지된 0에 서명하기 위해 플러시되기 때문).
정수 변환
다음 표에서는 위에서 설명한 다양한 표현에서 다른 표현으로의 변환에 대해 설명합니다. Direct3D에서 실제로 발생하는 변환만 표시됩니다.
원본 데이터 형식 | 대상 데이터 형식 | 변환 규칙 |
---|---|---|
SNORM | 뜨다 | 서명된 범위 [-1.0f에서 1.0f]를 나타내는 n비트 정수 값이 지정된 경우 부동 소수점으로의 변환은 다음과 같습니다.
|
뜨다 | SNORM | 부동 소수점 숫자를 지정하면 부호 있는 범위 [-1.0f에서 1.0f]를 나타내는 n비트 정수 값으로 변환하는 방법은 다음과 같습니다.
|
UNORM | 뜨다 | 시작 n비트 값은 float(0.0f, 1.0f, 2.0f 등)로 변환된 후 (2-1)로 나뉩니다. |
뜨다 | UNORM | 시작 값을 c로 표시합니다.
|
SRGB | 뜨다 | 다음은 이상적인 SRGB에서 FLOAT로의 변환입니다.
|
뜨다 | SRGB | 다음은 이상적인 FLOAT -> SRGB 변환입니다. 대상 SRGB 색 구성 요소에 n비트가 있다고 가정합니다.
|
SINT | 더 많은 비트가 있는 SINT | SINT에서 더 많은 비트가 있는 SINT로 변환하기 위해 시작 번호의 가장 중요한 비트(MSB)는 대상 형식으로 사용할 수 있는 추가 비트로 "기호 확장"입니다. |
UINT | 더 많은 비트가 있는 SINT | UINT에서 비트가 더 많은 SINT로 변환하려면 숫자가 대상 형식의 LSB(최소 중요 비트)로 복사되고 추가 MSB는 0으로 패딩됩니다. |
SINT | 더 많은 비트가 있는 UINT | 더 많은 비트를 사용하여 SINT에서 UINT로 변환하려면 음수이면 값이 0으로 고정됩니다. 그렇지 않으면 숫자가 대상 형식의 LSB에 복사되고 추가 MSB는 0으로 패딩됩니다. |
UINT | 더 많은 비트가 있는 UINT | 더 많은 비트를 사용하여 UINT에서 UINT로 변환하려면 숫자가 대상 형식의 LSB로 복사되고 추가 MSB는 0으로 패딩됩니다. |
SINT 또는 UINT | 비트 수가 적거나 같은 SINT 또는 UINT | SINT 또는 UINT에서 더 적거나 같은 비트(및/또는 부호 변경)를 사용하여 SINT 또는 UINT로 변환하려면 시작 값이 대상 형식의 범위로 고정됩니다. |
고정 소수점 정수 변환
고정 소수점 정수는 고정 위치에 암시적 소수점이 있는 일부 비트 크기의 정수일 뿐입니다.
유비쿼터스 "정수" 데이터 형식은 숫자 끝에 소수점이 있는 고정 소수점 정수의 특수한 경우입니다.
고정 소수점 숫자 표현은 i.f로 특징지어지는데, 여기서는 정수 비트의 수이고 f는 소수 비트의 수입니다. 예를 들어 16.8은 16비트 정수와 8비트의 분수를 의미합니다. 정수 부분은 적어도 여기에 정의된 대로 2의 보수에 저장됩니다(부호 없는 정수에 대해서도 동일하게 정의할 수 있음). 소수 부분은 부호 없는 형식으로 저장됩니다. 소수 부분은 항상 가장 음수부터 시작하여 가장 가까운 두 정수 값 사이의 양수를 나타냅니다.
고정 소수점 수에 대한 추가 및 빼기 작업은 암시적 소수점이 있는 위치를 고려하지 않고 표준 정수 산술 연산을 사용하여 수행됩니다. 1을 16.8 고정 지점 번호에 추가한다는 것은 소수점이 숫자의 가장 중요한 끝에서 8자리이기 때문에 256을 추가하는 것을 의미합니다. 곱하기와 같은 다른 연산은 정수 산술을 사용하여 수행할 수 있을 뿐만 아니라 고정된 10진수에 미치는 영향을 고려하면 수행될 수 있습니다. 예를 들어 정수로 두 개의 16.8 정수에 곱하면 32.16 결과가 생성됩니다.
고정 소수점 정수 표현은 Direct3D에서 두 가지 방법으로 사용됩니다.
- 래스터라이저에서 잘린 후 꼭짓점 위치는 고정 지점으로 스냅되어 RenderTarget 영역에 정밀도를 균일하게 분산합니다. 한 예로 얼굴 컬링을 비롯한 많은 래스터라이저 작업은 고정 소수점 맞춤 위치에서 발생하지만 특성 보간기 설정과 같은 다른 작업은 고정 소수점 스냅 위치에서 부동 소수점으로 다시 변환된 위치를 사용합니다.
- 샘플링 작업에 대한 텍스처 좌표는 고정 지점(텍스처 크기로 크기 조정된 후)으로 스냅되어 필터 탭 위치/가중치를 선택하여 텍스처 공간에 정밀도를 균일하게 분산합니다. 실제 필터링 산술 연산이 수행되기 전에 가중치 값이 부동 소수점으로 다시 변환됩니다.
원본 데이터 형식 | 대상 데이터 형식 | 변환 규칙 |
---|---|---|
뜨다 | 고정 소수점 정수 | 다음은 부동 소수점 숫자 n을 고정 소수점 정수 i.f로 변환하는 일반적인 절차입니다. 여기서 i는 (부호 있는) 정수 비트의 수이고 f는 소수점 비트의 수입니다.
|
고정 소수점 정수 | 뜨다 | 부동 소수점 표현으로 변환되는 특정 고정 소수점 표현은 총 24비트 이상의 정보를 포함하지 않으며, 그 중 23비트를 넘지 않는 것이 분수 구성 요소에 있다고 가정합니다. 지정된 고정 소수점 숫자 fxp가 i.f 형식(i bits integer, f bits fraction)으로 있다고 가정합니다. float로의 변환은 다음 의사 코드와 유사합니다. float result = (float)(fxp >> f) + // extract 정수
|
관련 항목