Typy zasobów (Direct3D 10)
Wszystkie zasoby używane przez potok Direct3D pochodzą z dwóch podstawowych typów zasobów: i tekstury . Bufor to kolekcja danych pierwotnych (elementów); tekstura jest kolekcją texels (elementy tekstury).
- zasobów buforu
- zasoby tekstury
- typy tekstur
- subresources
- silne a słabe wpisywanie
- Tematy pokrewne
Istnieją dwa sposoby pełnego określenia układu (lub śladu pamięci) zasobu:
Przedmiot | Opis |
---|---|
typ |
W pełni określ typ podczas tworzenia zasobu. |
bez typów |
W pełni określ typ, gdy zasób jest powiązany z potokiem. |
Zasoby buforu
Zasób buforu to kolekcja w pełni typiowanych danych; wewnętrznie bufor zawiera elementy. Element składa się z od 1 do 4 składników. Przykłady typów danych elementów to: spakowana wartość danych (na przykład R8G8B8A8), pojedyncza 8-bitowa liczba całkowita, cztery 32-bitowe wartości zmiennoprzecinkowe. Te typy danych służą do przechowywania danych, takich jak wektor położenia, wektor normalny, współrzędna tekstury w buforze wierzchołka, indeks w buforze indeksu lub stan urządzenia.
Bufor jest tworzony jako zasób bez struktury. Ponieważ nie ma struktury, bufor nie może zawierać żadnych poziomów mipmap, nie jest filtrowany podczas odczytu i nie może być wieloprzykładowy.
Typy
- buforu wierzchołka
- bufor indeksu
- buforu stałego
Bufor wierzchołka
Bufor jest kolekcją elementów; bufor wierzchołka zawiera dane poszczególnych wierzchołków. Najprostszym przykładem jest bufor wierzchołka zawierający jeden typ danych, taki jak dane położenia. Można go zwizualizować tak jak na poniższej ilustracji.
Częściej bufor wierzchołka zawiera wszystkie dane potrzebne do pełnego określenia wierzchołków 3D. Przykładem może być bufor wierzchołka zawierający położenie wierzchołka, współrzędne normalne i tekstury. Te dane są zwykle zorganizowane jako zestawy elementów wierzchołków, jak pokazano na poniższej ilustracji.
Ten bufor wierzchołka zawiera dane na wierzchołki dla ośmiu wierzchołków; każdy wierzchołek przechowuje trzy elementy (położenie, normalne i współrzędne tekstury). Położenie i normalne są zwykle określone przy użyciu trzech 32-bitowych zmiennoprzecinków (DXGI_FORMAT_R32G32B32_FLOAT) i współrzędnych tekstury przy użyciu dwóch 32-bitowych zmiennoprzecinków (DXGI_FORMAT_R32G32_FLOAT).
Aby uzyskać dostęp do danych z buforu wierzchołka, musisz wiedzieć, do którego wierzchołka ma uzyskać dostęp, oraz inne parametry buforu:
- Przesunięcie — liczba bajtów od początku buforu do danych pierwszego wierzchołka. Przesunięcie jest dostarczane do IASetVertexBuffers.
- BaseVertexLocation — liczba bajtów od przesunięcia do pierwszego wierzchołka używanego przez odpowiednie wywołanie rysowania (zobacz Draw Methods).
Przed utworzeniem buforu wierzchołka należy zdefiniować jego układ, tworząc obiekt układu wejściowego; Jest to wykonywane przez wywołanie CreateInputLayout. Po utworzeniu obiektu układu wejściowego powiąż go ze etapem asemblera wejściowego, wywołując IASetInputLayout.
Aby utworzyć bufor wierzchołka, wywołaj metodę CreateBuffer.
Bufor indeksu
Bufor indeksu zawiera sekwencyjny zestaw indeksów 16-bitowych lub 32-bitowych; każdy indeks służy do identyfikowania wierzchołka w buforze wierzchołka. Używanie buforu indeksu z co najmniej jednym buforem wierzchołka w celu dostarczenia danych do etapu IA jest nazywane indeksowaniem. Bufor indeksu można wizualizować jak na poniższej ilustracji.
buforu indeksu
Sekwencyjne indeksy przechowywane w buforze indeksu znajdują się z następującymi parametrami:
- Przesunięcie — liczba bajtów od początku buforu do pierwszego indeksu. Przesunięcie jest dostarczane do IASetIndexBuffer.
- StartIndexLocation — liczba bajtów od przesunięcia do pierwszego wierzchołka używanego przez odpowiednie wywołanie rysowania (zobacz metody rysowania ).
- IndexCount — liczba indeksów do renderowania.
Aby utworzyć bufor indeksu, wywołaj metodę CreateBuffer.
Bufor indeksu może łączyć wiele pasów linii lub trójkątów, oddzielając każdy z indeksem wycięcia. Indeks wycięcia paska umożliwia rysowanie wielu pasków liniowych lub trójkątnych za pomocą pojedynczego wywołania rysowania. Indeks wycinania paska jest po prostu maksymalną możliwą wartością indeksu (0xffff dla indeksu 16-bitowego, 0xffffffff dla indeksu 32-bitowego). Indeks wycięcia paska resetuje kolejność uzwojenia w indeksowanych elementach pierwotnych i może służyć do usuwania konieczności degeneracji trójkątów, które w przeciwnym razie mogą być wymagane do utrzymania prawidłowej kolejności uzwojenia w trójkątnym pasie. Na poniższej ilustracji przedstawiono przykład indeksu wycinania paska.
indeksu wyciętego
Bufor stały
Direct3D 10 wprowadził nowy bufor do dostarczania stałych cieniowania nazywany buforem stałym cieniowania lub po prostu buforem stałym. Koncepcyjnie wygląda podobnie jak bufor wierzchołka pojedynczego elementu, jak pokazano na poniższej ilustracji.
buforu stałego cieniowania
Każdy element przechowuje stałą składnika od 1 do 4, określaną przez format przechowywanych danych.
stałe zmniejszają przepustowość wymaganą do aktualizowania stałych cieniowania, umożliwiając grupowanie i zatwierdzanie stałych cieniowania jednocześnie zamiast podejmowania poszczególnych wywołań w celu zatwierdzenia każdej stałej oddzielnie.
Aby utworzyć bufor stałej cieniowania, wywołaj CreateBuffer i określ flagę powiązania stałej buforu D3D10_BIND_CONSTANT_BUFFER (zobacz D3D10_BIND_FLAG).
Aby powiązać bufor stałej cieniowania z potokiem, wywołaj jedną z następujących metod: GSSetConstantBuffers, PSSetConstantBufferslub VSSetConstantBuffers.
Należy pamiętać, że w przypadku korzystania z interfejsu ID3D10Effect interfejsu procesu tworzenia, wiązania i komitowania buforu stałego jest obsługiwane przez wystąpienie ID3D10Effect Interface. W takim przypadku wystarczy pobrać zmienną z efektu przy użyciu jednej z metod GetVariable, takich jak GetVariableByName i zaktualizować zmienną za pomocą jednej z metod SetVariable, takich jak SetMatrix. Aby uzyskać przykład użycia interfejsu ID3D10Effect, do zarządzania buforem stałym, zobacz tutorial 07.
Moduł cieniowania nadal odczytuje zmienne w buforze stałym bezpośrednio według nazwy zmiennej w taki sam sposób, jak zmienne, które nie są częścią buforu stałego, są odczytywane.
Każdy etap cieniowania umożliwia maksymalnie 15 stałych cieniowania; każdy bufor może przechowywać do 4096 stałych.
Użyj buforu stałego do przechowywania wyników etapu strumienia wyjściowego.
Zobacz Constants (DirectX HLSL), aby zapoznać się z przykładem deklarowania buforu stałego w cieniowaniu.
Zasoby tekstur
Zasób tekstury to ustrukturyzowana kolekcja danych przeznaczona do przechowywania texels. W przeciwieństwie do tekstury mogą być filtrowane przez próbkatory tekstur, ponieważ są odczytywane przez jednostki cieniowania. Typ tekstury wpływa na sposób filtrowania tekstury. Texel reprezentuje najmniejszą jednostkę tekstury, którą można odczytać lub zapisać w potoku. Każdy texel zawiera od 1 do 4 składników rozmieszczonych w jednym z formatów DXGI (zobacz DXGI_FORMAT).
Tekstury są tworzone jako zasób ze strukturą, aby ich rozmiar był znany. Jednak każda tekstura może być typowana lub mniejsza w czasie tworzenia zasobów, o ile typ jest w pełni określony przy użyciu widoku, gdy tekstura jest powiązana z potokiem.
- typy tekstur
- subresources
- silne a słabe wpisywanie
Typy tekstur
Istnieje kilka typów tekstur: 1D, 2D, 3D, z których każdy można utworzyć z mipmapami lub bez nich. Direct3D 10 obsługuje również tablice tekstur i tekstury wieloampowe.
- tekstury 1D
- tablica tekstur 1D
- tekstury 2D i tablica tekstur 2D
- tekstury 3D
Tekstura 1D
Tekstura 1D w najprostszej postaci zawiera dane tekstury, które można rozwiązać za pomocą jednej współrzędnej tekstury; można go wizualizować jako tablicę texels, jak pokazano na poniższej ilustracji.
tekstury 1d
Każdy texel zawiera wiele składników kolorów w zależności od formatu przechowywanych danych. Dodając większą złożoność, można utworzyć teksturę 1D z poziomami mipmap, jak pokazano na poniższej ilustracji.
Poziom mipmap to tekstura, która jest mocą dwóch mniejszych niż poziom powyżej. Najwyższy poziom zawiera najwięcej szczegółów, każdy kolejny poziom jest mniejszy; dla mipmapy 1D najmniejszy poziom zawiera jeden texel. Różne poziomy są identyfikowane przez indeks o nazwie LOD (poziom szczegółowości); Można użyć LOD, aby uzyskać dostęp do mniejszej tekstury podczas renderowania geometrii, która nie jest tak blisko aparatu.
Tablica tekstur 1D
Direct3D 10 ma również nową strukturę danych dla tablicy tekstur. Tablica tekstur 1D wygląda koncepcyjnie podobnie jak na poniższej ilustracji.
Ta tablica tekstur zawiera trzy tekstury. Każda z trzech tekstur ma szerokość tekstury 5 (czyli liczbę elementów w pierwszej warstwie). Każda tekstura zawiera również 3 warstwy mipmap.
Wszystkie tablice tekstur w direct3D są homogeniczną tablicą tekstur; Oznacza to, że każda tekstura w tablicy tekstur musi mieć ten sam format danych i rozmiar (w tym szerokość tekstury i liczbę poziomów mipmap). Można tworzyć tablice tekstur o różnych rozmiarach, o ile wszystkie tekstury w każdej tablicy są zgodne z rozmiarem.
Tekstura 2D i tablica tekstur 2D
Zasób Texture2D zawiera siatkę 2D texels. Każdy texel jest adresowany przez wektor u, v. Ponieważ jest to zasób tekstury, może zawierać poziomy mipmap i podźródła. W pełni wypełniony zasób tekstury 2D wygląda jak na poniższej ilustracji.
Ten zasób tekstury zawiera jedną teksturę 3x5 z trzema poziomami mipmap.
Zasób Texture2DArray jest homogeniczną tablicą tekstur 2D; oznacza to, że każda tekstura ma ten sam format danych i wymiary (w tym poziomy mipmap). Ma podobny układ jak tablica tekstur 1D, z tą różnicą, że tekstury zawierają teraz dane 2D i dlatego wyglądają jak na poniższej ilustracji.
Ta tablica tekstur zawiera trzy tekstury; każda tekstura jest 3x5 z dwoma poziomami mipmap.
Używanie tekstury2DArray jako modułu tekstury
Kostka tekstury jest tablicą tekstury 2D, która zawiera 6 tekstur, po jednym dla każdej twarzy kostki. W pełni wypełniony sześcian tekstury wygląda jak na poniższej ilustracji.
Tablica tekstur 2D zawierająca 6 tekstur może być odczytywana z cieniowania za pomocą funkcji wewnętrznych mapy modułu, po ich powiązaniu z potokiem z widokiem tekstury modułu. Moduły tekstury są adresowane z cieniowania z wektorem 3D wskazującym z środka modułu tekstury.
Tekstura 3D
Zasób Texture3D (znany również jako tekstura objętościowa) zawiera objętość 3D texels. Ponieważ jest to zasób tekstury, może zawierać poziomy mipmap. W pełni wypełniona tekstura 3D wygląda jak na poniższej ilustracji.
Gdy wycinka mipmap tekstury 3D jest powiązana jako dane wyjściowe elementu docelowego renderowania (z widokiem obiektu docelowego renderowania), tekstura 3D zachowuje się identycznie z tablicą tekstur 2D z n wycinkami. Konkretny wycinek renderowania jest wybierany na etapie cieniowania geometrii, deklarując składnik skalarny danych wyjściowych jako wartość systemową SV_RenderTargetArrayIndex.
Nie ma pojęcia tablicy tekstur 3D; dlatego podźródło tekstury 3D jest pojedynczym poziomem mipmap.
Podźródła
Interfejs API Direct3D 10 odwołuje się do całych zasobów lub podzestawów zasobów. Aby określić część zasobów, direct3D ukuł termin podźródła, co oznacza podzbiór zasobu.
Bufor jest definiowany jako pojedynczy podźródło. Tekstury są nieco bardziej skomplikowane, ponieważ istnieje kilka różnych typów tekstur (1D, 2D itp.), z których niektóre obsługują poziomy mipmap i/lub tablic tekstury. Począwszy od najprostszego przypadku tekstura 1D jest definiowana jako pojedynczy podźródło, jak pokazano na poniższej ilustracji.
tekstury 1d
Oznacza to, że tablica texels tworząca teksturę 1D znajduje się w jednym podźródle.
Po rozwinięciu tekstury 1D z trzema poziomami mipmap można to zwizualizować w ten sposób.
Pomyśl o tym jako o jednej teksturze, która składa się z trzech podtekstów. Każda podtekstacja jest liowana jako podźródło, więc ta tekstura 1D zawiera 3 podźródła. Podtekst (lub podźródło) można indeksować przy użyciu poziomu szczegółów (LOD) dla pojedynczej tekstury. W przypadku korzystania z tablicy tekstur uzyskiwanie dostępu do określonego podtekstu wymaga zarówno lod, jak i konkretnej tekstury. Alternatywnie interfejs API łączy te dwa fragmenty informacji w jeden indeks podźródła opartego na zera, jak pokazano tutaj.
Wybieranie podźródła
Dostęp do całego zasobu interfejsu API (na przykład CopyResource), inne uzyskują dostęp do części zasobu (na przykład UpdateSubresource lub CopySubresourceRegion). Interfejs API, który uzyskuje dostęp do części zasobu, zazwyczaj używa opisu widoku (takiego jak D3D10_TEX2D_ARRAY_DSV), aby określić podźródła dostępu.
Te ilustracje ilustrują terminy używane przez opis widoku podczas uzyskiwania dostępu do tablicy tekstur.
Fragment tablicy
Biorąc pod uwagę tablicę tekstur, każda tekstura z mipmapami, wycinek tablicy (reprezentowany przez biały prostokąt) zawiera jedną teksturę i wszystkie jej podteksty, jak pokazano na poniższej ilustracji.
splice tablicy
Fragmentator mip
Fragment mip (reprezentowany przez biały prostokąt) zawiera jeden poziom mipmap dla każdej tekstury w tablicy, jak pokazano na poniższej ilustracji.
splice mip
Wybieranie pojedynczego podźródła
Możesz użyć tych dwóch typów wycinków, aby wybrać pojedyncze podźródło, jak pokazano na poniższej ilustracji.
Wybieranie wielu podźródła
Możesz też użyć tych dwóch typów wycinków z liczbą poziomów mipmap i/lub liczby tekstur, aby wybrać wiele podźródła.
Niezależnie od typu tekstury, którego używasz, z lub bez map mipmap z lub bez tablicy tekstury, można użyć funkcji pomocnika, D3D10CalcSubresource, aby obliczyć indeks określonego podźródła.
Silne a słabe wpisywanie
Utworzenie w pełni typizowanego zasobu ogranicza zasób do formatu, za pomocą którego został utworzony. Dzięki temu środowisko uruchomieniowe może zoptymalizować dostęp, zwłaszcza jeśli zasób jest tworzony z flagami wskazującymi, że nie można go zamapować przez aplikację. Zasobów utworzonych przy użyciu określonego typu nie można ponownie interpretować przy użyciu mechanizmu wyświetlania.
W przypadku typu mniejszego zasobu typ danych jest nieznany podczas pierwszego tworzenia zasobu. Aplikacja musi wybrać spośród dostępnych formatów mniejszego typu (zobacz DXGI_FORMAT). Należy określić rozmiar pamięci do przydzielenia i określić, czy środowisko uruchomieniowe będzie musiało wygenerować podteksty w mapie mip. Jednak dokładny format danych (czy pamięć zostanie zinterpretowana jako liczba całkowita, wartości zmiennoprzecinkowe, liczby całkowite bez znaku itp.) nie zostanie określony, dopóki zasób nie zostanie powiązany z potokiem z widokiem. Ponieważ format tekstury pozostaje elastyczny do momentu powiązania tekstury z potokiem, zasób jest określany jako magazyn o słabym typie. Magazyn o słabym typie ma zaletę ponownego użycia lub ponownego zinterpretowania (w innym formacie), o ile bit składnika nowego formatu jest zgodny z liczbą bitów starego formatu.
Pojedynczy zasób może być powiązany z wieloma etapami potoku, o ile każdy z nich ma unikatowy widok, który w pełni kwalifikuje formaty w każdej lokalizacji. Na przykład zasób utworzony w formacie DXGI_FORMAT_R32G32B32A32_TYPELESS może być używany jako DXGI_FORMAT_R32G32B32A32_FLOAT i DXGI_FORMAT_R32G32B32A32_UINT w różnych lokalizacjach potoku jednocześnie.
Tematy pokrewne
-
zasoby (Direct3D 10)