Udostępnij za pośrednictwem


Reguły konwersji danych

W poniższych sekcjach opisano, jak funkcja Direct3D obsługuje konwersje między typami danych.

Terminologia typu danych

Poniższy zestaw terminów jest następnie używany do scharakteryzowania różnych konwersji formatów.

Termin Definicja
SNORM Podpisana znormalizowana liczba całkowita, co oznacza, że dla liczby uzupełniającej n-bitowej 2 maksymalna wartość oznacza 1,0f (np. wartość 5-bitowa 01111 mapuje na wartość 1.0f), a wartość minimalna oznacza wartość -1.0f (np. wartość 5-bitowa 10000 map na -1.0f). Ponadto druga minimalna liczba jest mapowana na wartość -1.0f (np. wartość 5-bitowa 10001 jest mapowana na wartość -1.0f). W związku z tym istnieją dwie reprezentacje całkowite dla -1.0f. Istnieje pojedyncza reprezentacja dla 0,0f i pojedyncza reprezentacja dla 1.0f. Powoduje to utworzenie zestawu reprezentacji liczb całkowitych dla równomiernie rozmieszczonych wartości zmiennoprzecinkowych w zakresie (-1.0f... 0,0f), a także uzupełniający zestaw reprezentacji liczb w zakresie (0,0f... 1.0f)
UNORM Niepodpisane znormalizowane liczby całkowite, co oznacza, że dla liczby n-bitowej wszystkie 0 oznacza 0,0f, a wszystkie wartości 1 oznaczają wartość 1,0f. Reprezentowana jest sekwencja równomiernie rozmieszczonych wartości zmiennoprzecinkowych z zakresu od 0,0f do 1,0f. Np. 2-bitowy moduł UNORM reprezentuje 0,0f, 1/3, 2/3 i 1,0f.
SINT Całkowita. Liczba całkowita 2. np. 3-bitowa funkcja SINT reprezentuje wartości całkowite -4, -3, -2, -1, 0, 1, 2, 3.
UINT Liczba całkowita bez znaku. np. 3-bitowa funkcja UINT reprezentuje wartości całkowite 0, 1, 2, 3, 4, 5, 6, 7.
SPŁAWIK Wartość zmiennoprzecinkowa w dowolnej reprezentacji zdefiniowanej przez direct3D.
SRGB Podobnie jak UNORM, w tym dla n-bitowej liczby, wszystkie 0 oznacza 0,0f i wszystkie wartości 1 oznacza 1,0f. Jednak w przeciwieństwie do UNORM, z SRGB sekwencja niepodpisanych kodowań liczb całkowitych między wszystkimi 0 do wszystkich 1 reprezentuje nieliniowy postęp w interpretacji liczb zmiennoprzecinkowych, od 0,0f do 1,0f. W przybliżeniu, jeśli ten nieliniowy progresja, SRGB, jest wyświetlany jako sekwencja kolorów, wydaje się jako liniowa rampa poziomów jasności do "średniej" obserwatora, w warunkach wyświetlania "średniej", na "średnim" wyświetlaczu. Aby uzyskać szczegółowe informacje, zapoznaj się ze standardem kolorów SRGB, IEC 61996-2-1, w IEC (Międzynarodowa Komisja Elektrotechniczna).

 

Konwersja zmiennoprzecinkowa

Za każdym razem, gdy wystąpi konwersja zmiennoprzecinkowa między różnymi reprezentacjami, w tym do lub z reprezentacji nieprzecinkowych, obowiązują następujące reguły.

Zbieżnie z reprezentacji wyższego zakresu do niższej reprezentacji zakresu

  • Podczas konwersji na inny format zmiennoprzecinkowy jest używany zaokrąglony do zera. Jeśli element docelowy jest liczbą całkowitą lub stałym formatem punktu, jest używany współczynnik zaokrąglania do najbliższego parzystego, chyba że konwersja jest jawnie udokumentowana jako użycie innego zachowania zaokrąglania, takiego jak najbliższe zaokrąglanie dla funkcji FLOAT do SNORM, FLOAT do UNORM lub FLOAT do SRGB. Inne wyjątki to ftoi i ftou shader instrukcje, które używają zaokrąglonego do zera. Na koniec konwersje zmiennoprzecinkowe używane przez próbkator tekstury i rasteryzator mają określoną tolerancję mierzoną wLast-Place Unit-Last-Place z nieskończenie precyzyjnego ideału.
  • W przypadku wartości źródłowych większych niż zakres dynamiczny formatu docelowego niższego zakresu (np. duża wartość zmiennoprzecinkowa 32-bitowa jest zapisywana w 16-bitowym zmiennoprzecinkowym RenderTarget), maksymalna wartość reprezentująca (odpowiednio podpisana) wartość NIE obejmuje podpisanej nieskończoności (ze względu na zaokrąglenie do zera opisanego powyżej).
  • Wartość NaN w formacie wyższego zakresu zostanie przekonwertowana na reprezentację NaN w formacie niższego zakresu, jeśli reprezentacja NaN istnieje w formacie niższego zakresu. Jeśli niższy format nie ma reprezentacji NaN, wynik będzie miał wartość 0.
  • InF w formacie wyższego zakresu zostanie przekonwertowany na INF w formacie niższego zakresu, jeśli jest dostępny. Jeśli niższy format nie ma reprezentacji INF, zostanie przekonwertowany na wartość maksymalną, którą można przedstawić. Znak zostanie zachowany, jeśli będzie dostępny w formacie docelowym.
  • Denorm w formacie wyższego zakresu zostanie przekonwertowany na reprezentację Denorm w formacie niższego zakresu, jeśli jest dostępny w formacie niższego zakresu, a konwersja jest możliwa, w przeciwnym razie wynik wynosi 0. Bit znaku zostanie zachowany, jeśli jest dostępny w formacie docelowym.

Konwertowanie z reprezentacji niższego zakresu na reprezentację wyższego zakresu

  • Wartość NaN w formacie niższego zakresu zostanie przekonwertowana na reprezentację NaN w formacie wyższego zakresu, jeśli jest dostępna w formacie wyższego zakresu. Jeśli format wyższego zakresu nie ma reprezentacji NaN, zostanie przekonwertowany na 0.
  • Funkcja INF w formacie niższego zakresu zostanie przekonwertowana na reprezentację INF w formacie wyższego zakresu, jeśli jest dostępna w formacie wyższego zakresu. Jeśli wyższy format nie ma reprezentacji INF, zostanie przekonwertowany na maksymalną wartość reprezentującą (MAX_FLOAT w tym formacie). Znak zostanie zachowany, jeśli będzie dostępny w formacie docelowym.
  • Denorm w formacie niższego zakresu zostanie przekonwertowany na znormalizowaną reprezentację w formacie wyższego zakresu, jeśli to możliwe, lub na reprezentację Denorm w formacie wyższego zakresu, jeśli reprezentacja Denorm istnieje. Jeśli format wyższego zakresu nie ma reprezentacji Denorm, zostanie przekonwertowany na wartość 0. Znak zostanie zachowany, jeśli będzie dostępny w formacie docelowym. Należy pamiętać, że 32-bitowe liczby zmiennoprzecinkowe są liczone jako format bez reprezentacji Denorm (ponieważ Denorms w operacjach na 32-bitowych liczbach zmiennoprzecinkowych są opróżnione w celu podpisania zachowanej wartości 0).

Konwersja liczb całkowitych

W poniższej tabeli opisano konwersje z różnych reprezentacji opisanych powyżej na inne reprezentacje. Wyświetlane są tylko konwersje, które rzeczywiście występują w trybie Direct3D.

Typ danych źródłowych Docelowy typ danych Reguła konwersji
SNORM SPŁAWIK Biorąc pod uwagę n-bitową wartość całkowitą reprezentującą podpisany zakres [-1.0f do 1.0f], konwersja na zmiennoprzecinkowy jest następująca.
  • Najbardziej ujemna wartość jest mapowania na -1.0f. np. wartość 5-bitowa 10000 mapuje na wartość -1.0f.
  • Każda inna wartość jest konwertowana na zmiennoprzecinkowy (wywołaj ją c), a następnie wynik = c * (1,0f / (2⁽ⁿ⁻⁾-1)). Na przykład wartość 5-bitowa 10001 jest konwertowana na wartość -15.0f, a następnie podzielona przez 15.0f, co daje wartość -1.0f.
SPŁAWIK SNORM Biorąc pod uwagę liczbę zmiennoprzecinkową, konwersja na n-bitową wartość całkowitą reprezentującą podpisany zakres [-1.0f do 1.0f] jest następująca.
  • Niech c reprezentuje wartość początkową.
  • Jeśli wartość c to NaN, wynik wynosi 0.
  • Jeśli c > 1.0f, w tym INF, jest zaciskany do 1,0f.
  • Jeśli c < -1.0f, w tym -INF, jest zaciskany do -1.0f.
  • Przekonwertuj skalę zmiennoprzecinkową na skalę całkowitą: c = c * (2ⁿ⁻¹-1).
  • Przekonwertuj na liczbę całkowitą w następujący sposób.
    • Jeśli c >= 0, c = c + 0,5f, w przeciwnym razie c = c - 0,5f.
    • Upuść ułamek dziesiętny, a pozostała wartość zmiennoprzecinkowa (całkowita) jest konwertowana bezpośrednio na liczbę całkowitą.
Ta konwersja jest dozwolona tolerancjąD3D xx_FLOAT32_TO_INTEGER_TOLERANCE_IN_Unit-Last-Place Unit-Last-Place (po stronie liczby całkowitej). Oznacza to, że po przekonwertowaniu z liczby zmiennoprzecinkowej na liczbą całkowitą dowolna wartość wD3D xx_FLOAT32_TO_INTEGER_TOLERANCE_IN_ULP Unit-Last-Place godnej reprezentowania wartości formatu docelowego jest dozwolona do mapowania na tę wartość. Dodatkowe wymaganie dotyczące odwracalności danych gwarantuje, że konwersja nie jest dezdecyduje w całym zakresie, a wszystkie wartości wyjściowe są osiągalne. (W stałych pokazanych tutaj xx należy zastąpić wersją Direct3D, na przykład 10, 11 lub 12).
UNORM SPŁAWIK Początkowa wartość n-bitowa jest konwertowana na zmiennoprzecinkowe (0,0f, 1,0f, 2,0f itp.), a następnie podzielona przez (2ⁿ-1).
SPŁAWIK UNORM Niech c reprezentuje wartość początkową.
  • Jeśli wartość c to NaN, wynik wynosi 0.
  • Jeśli c > 1.0f, w tym INF, jest zaciskany do 1,0f.
  • Jeśli c < 0,0f, w tym -INF, jest zaciskany do 0,0f.
  • Przekonwertuj skalę zmiennoprzecinkową na skalę całkowitą: c = c * (2ⁿ-1).
  • Przekonwertuj na liczbę całkowitą.
    • c = c + 0,5f.
    • Ułamek dziesiętny jest porzucany, a pozostała wartość zmiennoprzecinkowa (całkowita) jest konwertowana bezpośrednio na liczbę całkowitą.
Ta konwersja jest dozwolona tolerancjąD3D xx_FLOAT32_TO_INTEGER_TOLERANCE_IN_ULP Unit-Last-Place (po stronie całkowitej). Oznacza to, że po przekonwertowaniu z liczby zmiennoprzecinkowej na liczbą całkowitą dowolna wartość wD3D xx_FLOAT32_TO_INTEGER_TOLERANCE_IN_ULP Unit-Last-Place godnej reprezentowania wartości formatu docelowego jest dozwolona do mapowania na tę wartość. Dodatkowe wymaganie dotyczące odwracalności danych gwarantuje, że konwersja nie jest dezdecyduje w całym zakresie, a wszystkie wartości wyjściowe są osiągalne.
SRGB SPŁAWIK Poniżej przedstawiono idealną konwersję SRGB na float.
  • Weź początkową wartość n-bitową, przekonwertuj ją na zmiennoprzecinkowy (0,0f, 1,0f, 2,0f itp.); wywołaj to c.
  • c = c * (1.0f / (2ⁿ-1))
  • Jeśli (c < = D3Dxx_SRGB_TO_FLOAT_THRESHOLD), wynik = c / D3Dxx_SRGB_TO_FLOAT_DENOMINATOR_1, inne: result = (c + D3Dxx_SRGB_TO_FLOAT_OFFSET)/D3Dxx_SRGB_TO_FLOAT_DENOMINATOR_2)D3Dxx_SRGB_TO_FLOAT_EXPONENT
Ta konwersja jest dozwolona tolerancjąD3D xx_SRGB_TO_FLOAT_TOLERANCE_IN_ULP Unit-Last-Place (po stronie SRGB).
SPŁAWIK SRGB Poniżej przedstawiono idealną konwersję FLOAT —> konwersji SRGB.
Zakładając, że docelowy składnik koloru SRGB ma n bitów:
  • Załóżmy, że wartość początkowa to c.
  • Jeśli wartość c to NaN, wynik wynosi 0.
  • Jeśli c > 1.0f, w tym INF, jest zaciskany do 1,0f.
  • Jeśli c < 0,0f, w tym -INF, jest zaciskany do 0,0f.
  • Jeśli (c <= D3Dxx_FLOAT_TO_SRGB_THRESHOLD), to: c = D3Dxx_FLOAT_TO_SRGB_SCALE_1 * c, inne: c = D3Dxx_FLOAT_TO_SRGB_SCALE_2 * c(D3Dxx_FLOAT_TO_SRGB_EXPONENT_NUMERATOR/D3Dxx_FLOAT_TO_SRGB_EXPONENT_DENOMINATOR) - D3Dxx_FLOAT_TO_SRGB_OFFSET
  • Przekonwertuj skalę zmiennoprzecinkową na skalę całkowitą: c = c * (2ⁿ-1).
  • Konwertuj na liczbę całkowitą:
    • c = c + 0,5f.
    • Ułamek dziesiętny jest porzucany, a pozostała wartość zmiennoprzecinkowa (całkowita) jest konwertowana bezpośrednio na liczbę całkowitą.
Ta konwersja jest dozwolona tolerancjąD3D xx_FLOAT32_TO_INTEGER_TOLERANCE_IN_ULP Unit-Last-Place (po stronie całkowitej). Oznacza to, że po przekonwertowaniu z liczby zmiennoprzecinkowej na liczbą całkowitą dowolna wartość wD3D xx_FLOAT32_TO_INTEGER_TOLERANCE_IN_ULP Unit-Last-Place godnej reprezentowania wartości formatu docelowego jest dozwolona do mapowania na tę wartość. Dodatkowe wymaganie dotyczące odwracalności danych gwarantuje, że konwersja nie jest dezdecyduje w całym zakresie, a wszystkie wartości wyjściowe są osiągalne.
SINT SINT z większą ilością bitów Aby przekonwertować z SINT na SINT z większą liczbą bitów, najbardziej znaczący bit (MSB) numeru początkowego to "znak rozszerzony" na dodatkowe bity dostępne w formacie docelowym.
UINT SINT z większą ilością bitów Aby przekonwertować z protokołu UINT na SINT z większą liczbą bitów, liczba jest kopiowana do najmniej znaczących bitów formatu docelowego (LSB), a dodatkowe bazy danych MSB są dopełniane wartością 0.
SINT Funkcja UINT z większą ilością bitów Aby przekonwertować z SINT na UINT z więcej bitów: jeśli ujemna, wartość jest zaciśnięta na 0. W przeciwnym razie liczba jest kopiowana do LSB formatu docelowego, a dodatkowe msB są dopełniane 0.
UINT Funkcja UINT z większą ilością bitów Aby przekonwertować z UINT na UINT z większą liczbą bitów, liczba jest kopiowana do LSB formatu docelowego, a dodatkowe MSB są dopełniane 0.
SINT lub UINT SINT lub UINT z mniejszą lub równą liczbą bitów Aby przekonwertować z SINT lub UINT na SINT lub UINT z mniejszej lub równej liczby bitów (i/lub zmiany w podpisie), wartość początkowa jest po prostu zaciśnięta do zakresu formatu docelowego.

 

Konwersja liczb całkowitych o stałym punkcie

Stałe liczby całkowite punktów są po prostu liczbami całkowitymi niektórych rozmiarów bitów, które mają niejawny punkt dziesiętny w stałej lokalizacji.

Wszechobecny typ danych "liczba całkowita" jest specjalnym przypadkiem stałej liczby całkowitej ze liczbą dziesiętną na końcu liczby.

Reprezentacje liczb stałych punktów są scharakteryzowane jako: i.f, gdzie i jest liczbą bitów całkowitych i f jest liczbą bitów ułamkowych. Np. 16,8 oznacza liczbę całkowitą 16 bitów, po której następuje 8 bitów ułamka. Część całkowita jest przechowywana w uzupełnieniu 2, co najmniej zgodnie z definicją w tym miejscu (chociaż można ją zdefiniować równie dla niepodpisanych liczb całkowitych). Część ułamkowa jest przechowywana w postaci niepodpisanej. Część ułamkowa zawsze reprezentuje ułamek dodatni między dwoma najbliższymi wartościami całkowitymi, zaczynając od najbardziej ujemnych.

Operacje dodawania i odejmowania na liczbach punktów stałych są wykonywane po prostu przy użyciu standardowej arytmetyki liczb całkowitych, bez konieczności uwzględnienia miejsca, w którym leży implikacja dziesiętna. Dodanie wartości 1 do liczby stałych punktów 16,8 oznacza dodanie wartości 256, ponieważ liczba dziesiętna wynosi 8 miejsc z najmniej znaczącego końca liczby. Inne operacje, takie jak mnożenie, można wykonać również po prostu przy użyciu arytmetyki całkowitej, pod warunkiem, że wpływ na stałą liczbę dziesiętną jest uwzględniany. Na przykład pomnożenie dwóch liczb całkowitych 16.8 przy użyciu mnożenia całkowitego daje wynik 32,16.

Stałe reprezentacje liczb całkowitych punktów są używane na dwa sposoby w trybie Direct3D.

  • Położenia wierzchołków po przyciętych do rasteryzatora są przyciągane do punktu stałego, aby równomiernie rozłożyć precyzję w obszarze RenderTarget. Wiele operacji rasteryzatora, w tym wytrychania twarzy jako jednego przykładu, występuje na stałym punkcie przyciągania pozycji, podczas gdy inne operacje, takie jak konfiguracja interpolatora atrybutów, używają pozycji, które zostały przekonwertowane z powrotem na zmiennoprzecinkowe z pozycji przyciągniętych punktów stałych.
  • Współrzędne tekstury dla operacji próbkowania są przyciągane do stałego punktu (po skalowaniu według rozmiaru tekstury), aby równomiernie rozłożyć precyzję w przestrzeni tekstury, wybierając lokalizacje/wagi naciśnięcia filtru. Wartości wagi są konwertowane z powrotem na zmiennoprzecinkowe przed wykonaniem rzeczywistego arytmetyki filtrowania.
Typ danych źródłowych Docelowy typ danych Reguła konwersji
SPŁAWIK Liczba całkowita o stałym punkcie Poniżej przedstawiono ogólną procedurę konwertowania liczby zmiennoprzecinkowej n na liczbę całkowitą o stałym punkcie i.f, gdzie i jest liczbą bitów całkowitych (podpisanych) i f jest liczbą bitów ułamkowych.
  • Compute FixedMin = -2⁽ⁱ⁻⁻ ⁾
  • Compute FixedMax = 2⁽ⁱ⁻⁾ - 2(-f)
  • Jeśli n jest wartością NaN, wynik = 0; jeśli n to +Inf, wynik = FixedMax*2f; jeśli n to -Inf, wynik = FixedMin*2f
  • Jeśli n >= FixedMax, wynik = Fixedmax*2f; if n <= FixedMin, result = FixedMin*2f
  • Inne obliczenia n*2f i przekonwertuj na liczbę całkowitą.
Implementacje są dozwolone D3Dxx_FLOAT32_TO_INTEGER_TOLERANCE_IN_ULP Unit-Last-Place tolerancji w wyniku liczby całkowitej, zamiast nieskończenie precyzyjnej wartości n*2f po ostatnim kroku powyżej.
Liczba całkowita o stałym punkcie SPŁAWIK Załóżmy, że określona reprezentacja punktu stałego konwertowana na zmiennoprzecinkowa nie zawiera więcej niż 24 bity informacji, z których nie znajduje się więcej niż 23 bity, z których jest w składniku ułamkowym. Załóżmy, że dana liczba punktów stałych, fxp, jest w postaci i.f (liczba całkowita bitów i f ułamek bitów). Konwersja na zmiennoprzecinkowa jest wyniszczana do następującego pseudokodu.
float result = (float)(fxp >> f) + // extract integer
((float)(fxp & (2f - 1)) / (2f)); wyodrębnianie ułamka

 

zasoby (Direct3D 10)