Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Począwszy od systemu Windows 8.1, funkcja Direct2D obsługuje kilka formatów skompresowanych pikseli bloków. Ponadto system Windows 8.1 zawiera nowy koder DDS składnika Windows Imaging (WIC), który umożliwia ładowanie i przechowywanie skompresowanych obrazów blokowych w formacie pliku DDS. Kompresja blokowa to technika zmniejszania ilości pamięci graficznej używanej przez zawartość mapy bitowej. Korzystając z kompresji blokowej, aplikacja może zmniejszyć zużycie pamięci i czasy ładowania dla tych samych obrazów rozdzielczości. Możesz też użyć większej lub większej rozdzielczości obrazów, jednocześnie zużywając tę samą pamięć procesora GPU.
Kompresja bloków jest używana przez aplikacje Direct3D od dłuższego czasu, a system Windows 8.1 jest również dostępny dla deweloperów aplikacji głównego nurtu i Direct2D.
W tym temacie opisano, jak działa kompresja bloków i jak używać jej w usługach WIC i Direct2D.
Informacje o kompresji bloku
Kompresja blokowa (BC) odnosi się do klasy technik kompresji w celu zmniejszenia rozmiarów tekstur. Funkcja Direct3D 11 obsługuje do 7 różnych formatów BC w zależności od poziomu funkcji. W systemie Windows 8.1 Direct2D wprowadzono obsługę formatów BC1, BC2 i BC3, które są dostępne na wszystkich poziomach funkcji.
Jak działa kompresja bloku
Skompresowane formaty bloku używają tej samej podstawowej techniki, aby zmniejszyć ilość miejsca zużywanego przez dane kolorów. Ta sekcja zawiera podsumowanie najprostszego algorytmu BC1. Aby uzyskać bardziej szczegółowe wyjaśnienie, zobacz Blokuj kompresję.
Po pierwsze, obraz jest podzielony na bloki o rozmiarze 4 o 4 piksele. Każdy blok jest kompresowany oddzielnie.
Uwaga
Oznacza to, że szerokość i wysokość obrazu muszą mieć wielokrotność 4 pikseli, aby można było ją skompresować.
Ten przykładowy obraz przedstawia blok 4x4 pikseli na obrazie.
Następnie w ciągu 4 do 4 bloków są zaznaczone dwa kolory "odwołania" i są kodowane jako dwie wartości 16-bitowe (5 bitów czerwony, 6 bitów zielony, 5 bitów niebieski). Wybór tych kolorów znacząco wpływa na jakość obrazu i jest nietrivial. Dwa kolory pośrednie są obliczane liniowo przez interpolację między dwoma kolorami odniesienia w przestrzeni kolorów RGB. Daje to łącznie 4 różne możliwe kolory; każdy kolor ma przypisaną wartość indeksu dwu bitowego. Należy jednak pamiętać, że tylko dwa kolory punktu końcowego muszą być przechowywane, ponieważ interpolacja jest stała.
Na tym rysunku kolory 0 i 3 są wybierane jako kolory "odwołania" dla bloku, podczas gdy kolory 1 i 2 są obliczane przy użyciu interpolacji liniowej.
Na koniec każdy piksel w bloku jest mapowany na jeden z czterech wcześniej obliczonych kolorów, a każdy piksel jest kodowany przy użyciu wartości indeksu dwu bitowego.
Łączna ilość danych używanych do reprezentowania tych 16 pikseli wynosi:
16 bits [to define a reference color] * 2 + 2 bits * 16 [number of pixels] = 64 bits
Powoduje to średnią gęstość 4 bitów na piksel. Dla porównania wspólny format DXGI_FORMAT_B8G8R8A8_UNORM pikseli zużywa 32 bity na piksel.
Ten diagram pokazuje, że każdy piksel jest zakodowany jako indeks 2-bitowy. Cały blok jest zakodowany w 64 bitach.
Istnieją odmiany obsługujące dane alfa i różne liczby kanałów kolorów. BC6H i BC7 używają znacznie różnych algorytmów w celu obsługi zawartości o wysokim zakresie dynamicznym (HDR) i zwiększenia jakości obrazu, odpowiednio.
Format pliku directDraw Surface (DDS)
Blokowe skompresowane dane są zwykle przechowywane w plikach DDS (DirectDraw Surface). Jeśli jesteś deweloperem Direct3D, możesz zapoznać się z plikami DDS. Należy pamiętać, że funkcja Direct2D obsługuje tylko niektóre funkcje DDS; Aby uzyskać więcej informacji, zobacz Wymagania dotyczące usługi DDS.
Zalety kompresji bloków
Formaty skompresowane blokuj różnią się od typowych formatów kompresji obrazów branżowych, takich jak JPEG, w których formaty BC są natywnie obsługiwane przez nowoczesne procesory GPU. Oznacza to, że można bezpośrednio załadować skompresowany obraz bloku do procesora GPU bez dekodowania ani dekompresji. Formaty BC zużywają średnio od 4 do 8 bitów na piksel; w porównaniu do typowej nieskompresowanej 32-bitowej mapy bitowej BGRA na piksel, powoduje to oszczędność pamięci 75% do 87,5%. Ponadto, ponieważ nie ma kroku dekodowania, czas ładowania obrazu BC jest znacznie zmniejszony w porównaniu z formatami takimi jak JPEG.
Kiedy należy używać kompresji blokuj
Należy rozważyć użycie skompresowanych obrazów blokowych w aplikacji zamiast innych formatów, takich jak JPEG, jeśli chcesz zmniejszyć zużycie pamięci map bitowych lub zmniejszyć czas dekodowania i ładowania.
Jednak kompresja bloków nie jest odpowiednia dla wszystkich przypadków i wymaga pewnych kompromisów. Najpierw algorytmy kompresji bloków są straty. Kompresja blokuj działa dobrze z naturalną zawartością fotograficzną, ale może wprowadzać niechciane artefakty wizualne do obrazów z ostrymi, wysokimi granicami kontrastu, takimi jak zrzuty ekranu generowane przez komputer. Przed ich użyciem upewnij się, że zasoby skompresowanych obrazów bloku mają akceptowalną jakość obrazu.
Po drugie, blokowanie skompresowanych plików DDS zwykle zużywa więcej miejsca na dysku niż porównywalne obrazy JPEG. Z kolei zwiększy to rozmiar pakietu aplikacji i wymagania dotyczące przepustowości sieci.
Korzystanie z kompresji bloku
W tej sekcji opisano sposób generowania i używania skompresowanych zasobów blokowych w aplikacji Direct2D.
Przegląd
Blokuj skompresowane pliki DDS są formatem zoptymalizowanym pod kątem środowiska uruchomieniowego, co oznacza, że są one specjalnie zoptymalizowane pod kątem dobrej wydajności w środowisku uruchomieniowym aplikacji. Zalecamy kontynuowanie korzystania z istniejącego potoku tworzenia i edytowania zasobów oraz konwertowanie na skompresowany format bloku podczas importowania ich do projektu aplikacji lub w czasie kompilacji.
Wymagania dotyczące usługi DDS
Format pliku DDS został zaprojektowany tak, aby obsługiwał szeroką gamę funkcji używanych w trybie Direct3D. Funkcja Direct2D używa tylko podzestawu tych funkcji. W związku z tym podczas tworzenia obrazów DDS do użycia z funkcją Direct2D należy pamiętać o następujących ograniczeniach:
- Dozwolone są tylko następujące wartości DXGI_FORMAT :
- DXGI_FORMAT_BC1_UNORM
- DXGI_FORMAT_BC2_UNORM
- DXGI_FORMAT_BC3_UNORM
- Należy użyć wstępnie zdumionych danych alfa. Obejmuje to starsze pliki DDS korzystające z formatów, które jawnie definiują premultiplied alfa (DXT1, DXT2, DXT4), a także pliki DDS używające struktury DDS_HEADER_DX10 z wartościami DDS_ALPHA_MODE_OPAQUE i DDS_ALPHA_MODE_PREMULTIPLIED.
- Wymiary X i Y muszą być wielokrotnościami 4 pikseli.
- Tekstury woluminów, mapy modułów, mipmapy lub tablice tekstur nie są dozwolone. Należy używać tylko obrazów źródłowych z jedną ramką.
Generowanie skompresowanych zasobów blokowych
Dostępnych jest wiele narzędzi do tworzenia DDS do tworzenia lub konwertowania skompresowanych plików DDS blokowych. Pamiętaj, że nie wszystkie narzędzia obsługują wymagania dotyczące używania plików DDS z funkcją Direct2D, zgodnie z opisem w poprzedniej sekcji.
Począwszy od programu Visual Studio 2013, możesz przekonwertować istniejące zasoby wizualne, takie jak JPEG i PNG, do poprawnego formatu skompresowanego bloku DDS jako automatycznej części procesu kompilacji. Jest to realizowane przy użyciu niestandardowego kroku kompilacji zadania zawartości obrazu.
Aby uzyskać informacje na temat sposobu konfigurowania tego elementu dla projektu, zobacz : Jak wyeksportować teksturę do użycia z aplikacjami Direct2D lub JavaScript.
Interfejsy API Direct2D
Funkcja Direct2D jest aktualizowana w systemie Windows 8.1 w celu obsługi następujących formatów pikseli:
- DXGI_FORMAT_BC1_UNORM
- DXGI_FORMAT_BC2_UNORM
- DXGI_FORMAT_BC3_UNORM
W przypadku powyższych formatów należy użyć wstępnie ułożonej alfa. Ponadto te formaty są prawidłowe tylko do użycia jako źródło, a nie element docelowy. Na przykład oznacza to, że można utworzyć mapę bitową Direct2D przy użyciu bc1, ale nie kontekstu urządzenia.
Następujące metody są aktualizowane w systemie Windows 8.1 w celu obsługi formatów BC:
- ID2D1DeviceContext::IsDxgiFormatSupported
- ID2D1DeviceContext::CreateBitmap
- ID2D1DeviceContext::CreateBitmapFromDxgiSurface
- ID2D1RenderTarget::CreateSharedBitmap
- ID2D1RenderTarget::CreateBitmapFromWicBitmap
- ID2D1Bitmap::CopyFromMemory
- ID2D1Bitmap::CopyFromBitmap
- ID2D1Bitmap1::GetSurface
Pamiętaj, że element CreateBitmapFromWicBitmap map przyjmuje element IWICBitmapSource jako interfejs; jednak w systemie Windows 8.1 WIC nie obsługuje uzyskiwania skompresowanych danych blokowych z usługi IWICBitmapSource i nie ma formatu pikseli WIC odpowiadającego DXGI_FORMAT_BC1_UNORM itp. Zamiast tego createBitmapFromWicBitmap określa, czy element IWICBitmapSource jest prawidłowym elementem DDS IWICBitmapFrameDecode i bezpośrednio ładuje skompresowane dane bloku. Możesz jawnie określić format pikseli w D2D1_BITMAP_PROPERTIES1 struktury lub zezwolić funkcji Direct2D na automatyczne określenie poprawnego formatu.
Interfejsy API składników programu Windows Imaging
Składnik Windows Imaging (WIC) dodaje nowy koder-dekoder DDS w systemie Windows 8.1. Ponadto dodaje nowe interfejsy, które obsługują dostęp do danych specyficznych dla usługi DDS, w tym blokowe skompresowane dane pikseli:
Blokuj skompresowane formaty pikseli WIC
W systemie Windows 8.1 nie ma żadnych nowych formatów skompresowanych pikseli bloku WIC. Zamiast tego, jeśli uzyskasz kod IWICBitmapFrameDecode z dekodera DDS i wywołasz CopyPixels, otrzymasz standardowe nieskompresowane piksele, takie jak WICPixelFormat32bppPBGRA. Za pomocą funkcji IWICDdsFrameDecode::CopyBlocks można uzyskać nieprzetworzone dane skompresowane bloku w postaci buforu pamięci z pliku DDS.
Dostęp do usługi DDS z wieloma ramkami
Format pliku DDS umożliwia przechowywanie wielu powiązanych obrazów w jednym pliku. Na przykład plik DDS może zawierać mapę modułu, teksturę woluminu lub tablicę tekstur, z których wszystkie mogą być mipmapped. W usłudze Direct3D te wiele obrazów jest uwidacznianych jako podźródła. W usłudze WIC wiele obrazów jest uwidacznianych jako ramki (IWICBitmapFrameDecode i IWICBitmapFrameEncode).
Funkcja WIC obsługuje tylko pojęcie jednowymiarowej tablicy ramek, natomiast usługa DDS obsługuje trzy niezależne wymiary (chociaż tylko dwa mogą być używane w jednym pliku). Funkcja WIC zapewnia wygodne metody ułatwiające mapowanie między podźródło DDS i ramką WIC. W przypadku dekodowania IWICDdsDecoder::GetFrame umożliwia określenie indeksu tablicy, poziomu mip i indeksu fragmentatora podźródła i zwraca poprawną ramkę WIC.
W przypadku kodowania IWICDdsEncoder::CreateNewFrame oblicza wynikowy indeks tablicy, poziom mip i indeks fragmentatora podczas tworzenia nowej ramki. Aby zdefiniować parametry pliku specyficzne dla usługi DDS, musisz najpierw mieć nazwę IWICDdsEncoder::SetParameters .
Tematy pokrewne
-
Instrukcje: eksportowanie tekstury do użycia z aplikacjami Direct2D lub Javascipt
-
dokumentacja dla usługi DDS