Reguły konwersji danych
W poniższych sekcjach opisano, jak funkcja Direct3D obsługuje konwersje między typami danych.
- terminologii typu danych
- konwersji zmiennoprzecinkowych
- konwersji liczby całkowitej
- konwersji liczby całkowitej o stałym punkcie
- Tematy pokrewne
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.
|
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.
|
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ą.
|
SRGB | SPŁAWIK | Poniżej przedstawiono idealną konwersję SRGB na float.
|
SPŁAWIK | SRGB | Poniżej przedstawiono idealną konwersję FLOAT —> konwersji SRGB. Zakładając, że docelowy składnik koloru SRGB ma n bitów:
|
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.
|
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
|
Tematy pokrewne
-
zasoby (Direct3D 10)