Cieniowanie zmiennej szybkości (VRS)
Motywacja dla VRS
Ze względu na ograniczenia wydajności renderowanie grafiki nie zawsze może sobie pozwolić na dostarczenie tego samego poziomu jakości do każdej części obrazu wyjściowego. Cieniowanie o zmiennej szybkości — lub grubsze cieniowanie pikseli — to mechanizm, który umożliwia przydzielanie wydajności/zasilania renderowania w zależności od renderowanego obrazu.
W niektórych przypadkach współczynnik cieniowania można zmniejszyć z niewielką lub bez redukcji wydajności danych wyjściowych; co prowadzi do poprawy wydajności, która jest zasadniczo bezpłatna.
Bez VRS — wieloskładowe tworzenie aliasów z supersamplingiem
Bez cieniowania o zmiennym tempie jedynym sposobem kontrolowania współczynnika cieniowania jest użycie wieloaskładowego aliasowania (MSAA) z wykonywaniem opartym na próbce (znanym również jako superprzykładowanie).
MSAA to mechanizm zmniejszania aliasów geometrycznych i poprawy jakości renderowania obrazu w porównaniu z brakiem użycia usługi MSAA. Liczba próbek MSAA, która może być 1x, 2x, 4x, 8x lub 16x, zarządza liczbą próbek przydzielonych na piksel docelowy renderowania. Liczba próbek MSAA musi być znana z góry po przydzieleniu obiektu docelowego i nie można jej później zmienić.
Supersampling powoduje, że cieniowanie pikseli jest wywoływane raz na próbkę, przy wyższej jakości, ale także wyższe koszty wydajności w porównaniu z wykonaniem na piksel.
Aplikacja może kontrolować szybkość cieniowania, wybierając między wykonywaniem na piksel lub msAA-with-supersampling. Te dwie opcje nie zapewniają bardzo precyzyjnej kontroli. Ponadto możesz chcieć uzyskać niższą szybkość cieniowania dla określonej klasy obiektów w porównaniu z resztą obrazu. Takie obiekty mogą zawierać obiekt za elementem HUD lub przezroczystość, rozmycie (głębokość pola, ruch itp.) lub zniekształcenie optyczne z powodu optyki VR. Ale to nie byłoby możliwe, ponieważ jakość cieniowania i koszty są stałe na całym obrazie.
Za pomocą cieniowania zmiennej szybkości (VRS)
Model cieniowania o zmiennym tempie (VRS) rozszerza model supersampling-with-MSAA na przeciwległy, "gruby piksel", kierunek, dodając koncepcję grubszych cieniowania. W tym miejscu można wykonywać cieniowanie z częstotliwością bardziej grubszą niż piksel. Innymi słowy, grupę pikseli można zacienić jako pojedynczą jednostkę, a wynik jest następnie emitowany do wszystkich próbek w grupie.
Grubszy interfejs API cieniowania umożliwia aplikacji określenie liczby pikseli należących do zacienionej grupy lub grubszych pikseli. Po przydzieleniu elementu docelowego renderowania można zmienić rozmiar grubszych pikseli. Dlatego różne części ekranu lub różne przebiegi losowania mogą mieć różne współczynniki cieniowania.
Poniżej przedstawiono tabelę opisującą, który poziom MSAA jest obsługiwany z grubszym rozmiarem pikseli dla platform obsługujących grubsze cieniowanie:
- W przypadku komórek oznaczonych ta kombinacja jest włączona.
- W przypadku komórek oznaczonych capkombinacja jest warunkowo włączona na podstawie limitu (AdditionalShadingRatesSupported).
- W przypadku komórek, które są puste, ta kombinacja jest nieobsługiwana.
- W przypadku komórek, które są cieniowane w połowie, ta kombinacja jest nieobsługiwana, i obejmuje śledzenie więcej niż 16 próbek na wywołanie cieniowania pikseli. W przypadku śledzenia więcej niż 16 próbek istnieją dodatkowe bariery wyrównania sprzętu do obsługi w porównaniu z innymi przypadkami.
Warstwy funkcji
Implementacja VRS obejmuje dwie warstwy i dwie możliwości, dla których można wykonywać zapytania. Każda warstwa jest szczegółowo opisana po tabeli.
warstwVRS
Warstwa 1
- Współczynnik cieniowania można określić tylko na podstawie narysu; nie bardziej szczegółowe niż to.
- Współczynnik cieniowania stosuje się równomiernie do tego, co jest rysowane niezależnie od tego, gdzie leży w obiekcie docelowym renderowania.
Warstwa 2
- Współczynnik cieniowania można określić na podstawie narysu, jak w warstwie 1. Można go również określić za pomocą kombinacji podstawy narysowania i:
- Semantyka z każdego prowokującego wierzchołka i
- obraz obszaru ekranu.
- Współczynniki cieniowania z trzech źródeł są łączone przy użyciu zestawu kombinatorów.
- Rozmiar kafelka obrazu obszaru ekranu to 16x16 lub mniejszy.
- Szybkość cieniowania żądana przez aplikację jest gwarantowana do dostarczenia dokładnie (w przypadku precyzji filtrów czasowych i innych rekonstrukcji).
- SV_ShadingRate dane wejściowe PS są obsługiwane.
- Wskaźnik cieniowania per-provoking-wierzchołka (znany również jako per-primitive) jest prawidłowy, gdy używany jest jeden port widoków i
SV_ViewportArrayIndex
nie jest zapisywany. - Częstotliwość prowokowania wierzchołków może być używana z więcej niż jednym portem widoków, jeśli SupportsPerVertexShadingRateWithMultipleViewports możliwości jest ustawiona na
true
. Ponadto w takim przypadku ta stawka może być używana podczas zapisywaniaSV_ViewportArrayIndex
.
Lista możliwości
-
additionalShadingRatesSupported
- Typ logiczny.
- Wskazuje, czy rozmiary pikseli 2x4, 4x2 i 4x4 są obsługiwane w przypadku renderowania pojedynczego próbkowania; i czy grubszy rozmiar pikseli 2x4 jest obsługiwany dla 2x MSAA.
-
SupportsPerVertexShadingRateWithMultipleViewports
- Typ logiczny.
- Wskazuje, czy można używać więcej niż jednego rzutowania z wierzchołkiem na wierzchołek (nazywanym również współczynnikiem cieniowania poszczególnych elementów pierwotnych).
Określanie współczynnika cieniowania
W celu zapewnienia elastyczności w aplikacjach dostępnych jest wiele mechanizmów kontroli nad współczynnikiem cieniowania. Różne mechanizmy są dostępne w zależności od warstwy funkcji sprzętu.
Lista poleceń
Jest to najprostszy mechanizm ustawiania współczynnika cieniowania. Jest ona dostępna we wszystkich warstwach.
Aplikacja może określić grubszy rozmiar pikseli przy użyciu ID3D12GraphicsCommandList5::RSSetShadingRate metody. Ten interfejs API przyjmuje jeden argument wyliczenia. Interfejs API zapewnia ogólną kontrolę nad poziomem jakości renderowania — możliwość ustawiania współczynnika cieniowania na podstawie narysu.
Wartości tego stanu są wyrażane za pomocą wyliczenia D3D12_SHADING_RATE.
Obsługa rozmiaru coarse pixel
Współczynniki cieniowania 1x1, 1x2, 2x1 i 2x2 są obsługiwane we wszystkich warstwach.
Istnieje możliwość, AdditionalShadingRatesSupported, aby wskazać, czy na urządzeniu są obsługiwane 2x4, 4x2 i 4x4.
Obraz obszaru ekranu (oparty na obrazie)
W warstwie 2 i wyższej można określić szybkość cieniowania pikseli za pomocą obrazu obszaru ekranu.
Obraz obszaru ekranu umożliwia aplikacji utworzenie obrazu "maski poziom-of-detail" wskazującego regiony o różnej jakości, takie jak obszary, które będą objęte rozmyciem ruchu, rozmyciem głębokości pola, przezroczystymi obiektami lub elementami interfejsu użytkownika HUD. Rozdzielczość obrazu znajduje się w makrach; nie jest to rozwiązanie elementu docelowego renderowania. Innymi słowy, dane współczynnika cieniowania są określane z dokładnością do 8x8 lub 16x16 pikseli kafelków, zgodnie z rozmiarem kafelka VRS.
Rozmiar kafelka
Aplikacja może wysyłać zapytania do interfejsu API w celu pobrania obsługiwanego rozmiaru kafelka VRS dla swojego urządzenia.
Kafelki są kwadratowe, a rozmiar odnosi się do szerokości lub wysokości kafelka w texels.
Jeśli sprzęt nie obsługuje cieniowania zmiennej warstwy 2, zapytanie dotyczące możliwości dla rozmiaru kafelka zwraca wartość 0.
Jeśli sprzętu obsługuje cieniowanie o zmiennej szybkości 2, rozmiar kafelka jest jedną z tych wartości.
- 8
- 16
- 32
Rozmiar obrazu obszaru ekranu
W przypadku elementu docelowego renderowania o rozmiarze {rtWidth, rtHeight}, używając danego rozmiaru kafelka o nazwie VRSTileSize, obraz obszaru ekranu, który będzie obejmował ten rozmiar.
{ ceil((float)rtWidth / VRSTileSize), ceil((float)rtHeight / VRSTileSize) }
Lewy górny obraz obszaru ekranu (0, 0) jest zablokowany w lewym górnym rogu obiektu renderowanego (0, 0).
Aby wyszukać współrzędną (x,y) kafelka, która odpowiada określonej lokalizacji w obiekcie docelowym renderowania, podziel współrzędne przestrzeni okna (x, y) według rozmiaru kafelka, ignorując bity ułamkowe.
Jeśli obraz obszaru ekranu jest większy niż dla danego elementu docelowego renderowania, dodatkowe części po prawej stronie i/lub dolnej nie są używane.
Jeśli obraz obszaru ekranu jest zbyt mały dla danego obiektu docelowego renderowania, każda próba odczytu z obrazu poza rzeczywistymi zakresami daje domyślną szybkość cieniowania wynoszącą 1x1. Dzieje się tak, ponieważ lewy górny obraz obszaru ekranu (0, 0) jest zablokowany do lewej górnej części elementu docelowego renderowania (0, 0) i "odczytywanie poza zakresami obiektów docelowych renderowania" oznacza odczytywanie zbyt dużych wartości dla wartości x i y.
Formatowanie, układ, właściwości zasobu
Format tej powierzchni to jednokanałowa powierzchnia 8-bitowa (DXGI_FORMAT_R8_UINT).
Zasób jest wymiarem TEXTURE2D.
Nie można jej tablicy ani mapować. Musi mieć jawnie jeden poziom mip.
Zawiera liczbę próbek 1 i jakość próbki 0.
Ma układ tekstury UNKNOWN. Niejawnie nie może być układem głównym wiersza, ponieważ karta krzyżowa nie jest dozwolona.
Oczekiwany sposób wypełniania danych obrazu obszaru ekranu to jeden z następujących sposobów:
- Zapisywanie danych przy użyciu cieniowania obliczeniowego; obraz obszaru ekranu jest powiązany jako UAV lub
- Skopiuj dane do obrazu obszaru ekranu.
Podczas tworzenia obrazu obszaru ekranu te flagi są dozwolone.
- ŻADEN
- ALLOW_UNORDERED_ACCESS
- DENY_SHADER_RESOURCE
Te flagi nie są dozwolone.
- ALLOW_RENDER_TARGET
- ALLOW_DEPTH_STENCIL
- ALLOW_CROSS_ADAPTER
- ALLOW_SIMULTANEOUS_ACCESS
- VIDEO_DECODE_REFERENCE_ONLY
Typ sterta zasobu nie może być PRZEKAZYWANY ani READBACK.
Nie można SIMULTANEOUS_ACCESS zasobu. Zasób nie może być adapterem krzyżowym.
Dane
Każdy bajt obrazu obszaru ekranu odpowiada wartości wyliczenia D3D12_SHADING_RATE.
Stan zasobu
Zasób musi zostać przeniesiony do stanu tylko do odczytu, gdy jest używany jako obraz obszaru ekranu. Stan tylko do odczytu, D3D12_RESOURCE_STATE_SHADING_RATE_SOURCE, jest zdefiniowany w tym celu.
Zasób obrazu zostanie przeniesiony z tego stanu, aby ponownie stał się zapisywalny.
Ustawianie obrazu
Obraz obszaru ekranu do określania współczynnika cieniowania jest ustawiany na liście poleceń.
Zasób, który został ustawiony jako źródło współczynnika cieniowania, nie może być odczytywany ani zapisywany z dowolnego etapu cieniowania.
Obraz null
obszaru ekranu można ustawić na potrzeby określania współczynnika cieniowania. Ma to wpływ 1x1 stale używany jako wkład obrazu obszaru ekranu. Obraz obszaru ekranu można początkowo uznać za ustawiony na null
.
Podwyższanie poziomu i rozpadu
Zasób obrazu obszaru ekranu nie ma żadnych specjalnych konsekwencji w odniesieniu do podwyższania poziomu lub rozpadu.
Atrybut per-primitive
Atrybut per-primitive dodaje możliwość określenia terminu współczynnika cieniowania jako atrybutu z prowokującego wierzchołka. Ten atrybut jest płasko cieniowany — czyli jest propagowany do wszystkich pikseli w bieżącym trójkącie lub linii pierwotnej. Użycie atrybutu per-primitive może umożliwić bardziej szczegółową kontrolę jakości obrazu w porównaniu z innymi specyfikatorami współczynnika cieniowania.
Atrybut per-primitive to semantyka ustawiana o nazwie SV_ShadingRate
.
SV_ShadingRate
istnieje w ramach modelu cieniowania HLSL 6.4.
Jeśli zestawy vs lub GS SV_ShadingRate
, ale VRS nie jest włączone, semantyczne ustawienie nie ma żadnego wpływu. Jeśli nie określono żadnej wartości dla SV_ShadingRate
dla elementu pierwotnego, przyjmuje się, że wartość współczynnika cieniowania 1x1 jest przyjmowana jako współtworzenie pierwotne.
Łączenie czynników współczynnika cieniowania
Różne źródła współczynnika cieniowania są stosowane w sekwencji przy użyciu tego diagramu.
Każda para A i B jest połączona przy użyciu łączenia.
* Podczas określania współczynnika cieniowania według atrybutu wierzchołka.
- W przypadku użycia cieniowania geometrii można określić współczynnik cieniowania.
- Jeśli cieniowanie geometrii nie jest używane, współczynnik cieniowania jest określany przez prowokujący wierzchołek.
Lista kombinatorów
Obsługiwane są następujące kombinatory. Przy użyciu kombinatora (C) i dwóch danych wejściowych (A i B).
- przekazywanie. C.xy = A.xy.
- Przesłoń. C.xy = B.xy.
- Wyższa jakość. C.xy = min(A.xy, B.xy).
- niższej jakości. C.xy = max(A.xy, B.xy).
- Zastosuj koszt B względemA. C.xy = min(maxRate, A.xy + B.xy).
gdzie maxRate
jest największym dozwolonym wymiarem grubego piksela na urządzeniu. Byłoby to
-
D3D12_AXIS_SHADING_RATE_2X (czyli wartość 1), jeśli wartość AdditionalShadingRatesSupported jest
false
. -
D3D12_AXIS_SHADING_RATE_4X (czyli wartość 2), jeśli wartość AdditionalShadingRatesSupported jest
true
.
Wybór łączenia cieniowania zmiennej szybkości jest ustawiany na liście poleceń za pośrednictwem ID3D12GraphicsCommandList5::RSSetShadingRate.
Jeśli żadne kombinatory nigdy nie są ustawione, pozostają one na wartości domyślnej, czyli PASSTHROUGH.
Jeśli źródłem łączenia jest D3D12_AXIS_SHADING_RATE, który nie jest dozwolony w tabeli obsługi, dane wejściowe są czyszkowane do współczynnika cieniowania, który jest obsługiwany.
Jeśli dane wyjściowe kombinatora nie odpowiadają współczynnikowi cieniowania obsługiwanemu na platformie, wynik jest czyszczący do współczynnika cieniowania, który jest obsługiwany.
Domyślne czyszczenie stanu i stanu
Wszystkie źródła współczynników cieniowania, a mianowicie
- szybkość określona przez stan potoku (określona na liście poleceń)
- szybkość określona przez obraz obszaru ekranu i
- atrybut per-primitive
mają wartość domyślną D3D12_SHADING_RATE_1X1. Domyślne kombinatory to {PASSTHROUGH, PASSTHROUGH}.
Jeśli nie określono obrazu miejsca na ekranie, z tego źródła zostanie wywnioskowana szybkość cieniowania 1x1.
Jeśli nie określono atrybutu per-primitive, to współczynnik cieniowania 1x1 jest wywnioskowany z tego źródła.
ID3D12CommandList::ClearState resetuje szybkość określoną przez potok do wartości domyślnej, a wybór obrazu obszaru ekranu na wartość domyślną "brak obrazu ekranu".
Wykonywanie zapytań dotyczących współczynnika cieniowania przy użyciu SV_ShadingRate
Warto wiedzieć, jaki współczynnik cieniowania został wybrany przez sprzęt w dowolnym momencie wywołania cieniowania pikseli. Może to umożliwić różne optymalizacje w kodzie ps. Zmienna systemowa tylko ps, SV_ShadingRate
, zawiera informacje o współczynniku cieniowania.
Typ
Typ tej semantyki to uint.
Interpretacja danych
Dane są interpretowane jako wartość wyliczenia D3D12_SHADING_RATE.
Jeśli usługa VRS nie jest używana
Jeśli nie jest używane grubsze cieniowanie pikseli, SV_ShadingRate
jest odczytywany z powrotem jako wartość 1x1 wskazującą drobne piksele.
Zachowanie w ramach wykonywania opartego na próbach
Cieniowanie pikseli kończy się niepowodzeniem kompilacji, jeśli wprowadza SV_ShadingRate
, a także używa przykładowego wykonywania — na przykład przez wprowadzenie SV_SampleIndex
lub użycie przykładowego słowa kluczowego interpolacji.
Uwagi dotyczące odroczonego cieniowania
Odroczone cieniowanie oświetlenia aplikacji może wymagać znajomości współczynnika cieniowania używanego dla którego obszaru ekranu. Jest to tak, że oświetlenie przekazywane dyspozytorów może być uruchamiane z grubszą szybkością. Zmienna
SV_ShadingRate
może służyć do wykonania tej czynności, jeśli zostanie zapisana w gbuffer.
Głębokość i wzornik
Gdy używane jest grubsze cieniowanie pikseli, głębokość i wzornik i pokrycie są zawsze obliczane i emitowane w pełnej rozdzielczości próbki.
Użycie żądanego współczynnika cieniowania
W przypadku wszystkich warstw oczekiwano, że jeśli żądana jest stawka cieniowania i jest obsługiwana w połączeniu urządzenia i MSAA na poziomie, to jest to szybkość cieniowania dostarczana przez sprzęt.
Żądana szybkość cieniowania oznacza współczynnik cieniowania obliczony jako dane wyjściowe kombinatorów (zobacz sekcję Łączenie współczynników cieniowania w tym temacie).
Obsługiwana szybkość cieniowania to 1x1, 1x2, 2x1 lub 2x2 w operacji renderowania, w której liczba próbek jest mniejsza lub równa czterech. Jeśli funkcja AdditionalShadingRatesSupported jest true
, to 2x4, 4x2 i 4x4 są również obsługiwane współczynniki cieniowania dla niektórych przykładowych liczb (zobacz tabelę w z cieniowaniem zmiennym (VRS) sekcji w tym temacie).
Pochodne odstępu ekranu
Obliczenia gradientów pikseli do sąsiadujących pikseli mają wpływ na grubsze cieniowanie pikseli. Na przykład w przypadku użycia 2x2 grubszych pikseli gradient będzie dwa razy większy niż w przypadku, gdy nie są używane grube piksele. Aplikacja może chcieć dostosować cieniowania, aby zrekompensować to lub nie, w zależności od żądanych funkcji.
Ponieważ mips są wybierane na podstawie pochodnej przestrzeni ekranu, użycie grubszego cieniowania pikseli wpływa na wybór mip. Użycie grubszych cieniowania pikseli powoduje wybranie mniej szczegółowych mips w porównaniu do sytuacji, gdy nie są używane grube piksele.
Interpolacja atrybutów
Dane wejściowe do cieniowania pikseli mogą być interpolowane na podstawie ich wierzchołków źródłowych. Ponieważ cieniowanie o zmiennym tempie wpływa na obszary obiektu docelowego zapisywane przez każde wywołanie cieniowania pikseli, współdziała z interpolacją atrybutów. Trzy typy interpolacji to środek, centroid i próbka.
Centrum
Środkowa lokalizacja interpolacji dla grubszego piksela to geometryczny środek pełnego grubego obszaru pikseli.
SV_Position
jest zawsze interpolowana w środku grubego obszaru pikseli.
Strefy
Gdy cieniowanie w grubych pikselach jest używane z usługą MSAA, dla każdego piksela grzywny nadal będą zapisywane pełnej liczby próbek przydzielonych dla poziomu MSAA docelowego. W związku z tym lokalizacja interpolacji centroid będzie uwzględniać wszystkie próbki dla drobnych pikseli w grubych pikselach. Oznacza to, że lokalizacja interpolacji centroidu jest zdefiniowana jako pierwsza omówiona próbka, zwiększając kolejność indeksu próbki. Skuteczne pokrycie próbki jest and-ed z odpowiadającym bitem stanu rasterizatora SampleMask.
Nuta
Gdy w warstwie 1 jest używana grubsza cieniowanie pikseli, maska próbki jest zawsze pełną maską. Jeśli maska SampleMask nie jest maską pełną, cieniowanie grubszych pikseli jest wyłączone w warstwie 1.
Wykonywanie oparte na przykładach
Wykonywanie oparte na próbce lub supersampling— które jest spowodowane użyciem funkcji interpolacji próbki — może być używane z grubszym cieniowaniem pikseli i powoduje wywołanie cieniowania pikseli na próbkę. W przypadku obiektów docelowych liczby próbek N cieniowanie pikseli jest wywoływane N razy na piksel.
EvaluateAttributeSnapped
Funkcje wewnętrzne modelu ściągania nie są zgodne z grubszą cieniowaniem pikseli w warstwie 1. Jeśli próbujesz użyć funkcji wewnętrznych modelu ściągania z grubszym cieniowaniem pikseli w warstwie 1, cieniowanie pikseli grubszych jest automatycznie wyłączone.
Wewnętrzne EvaluateAttributeSnapped
mogą być używane z grubszych cieniowania pikseli w warstwie 2. Jego składnia jest taka sama, jak zawsze.
numeric EvaluateAttributeSnapped(
in attrib numeric value,
in int2 offset);
W przypadku kontekstu EvaluateAttributeSnapped
ma parametr przesunięcia z dwoma polami. W przypadku użycia bez grubszych cieniowania pikseli używane są tylko cztery bity niższej kolejności z pełnych trzydziestu dwóch. Te cztery bity reprezentują zakres [-8, 7]. Ten zakres obejmuje siatkę 16x16 w pikselach. Zakres jest taki, że znajdują się górne i lewe krawędzie piksela, a dolne i prawe krawędzie nie. Przesunięcie (-8, -8) znajduje się w lewym górnym rogu, a przesunięcie (7, 7) jest w prawym dolnym rogu. Przesunięcie (0, 0) to środek piksela.
W przypadku użycia z grubszym cieniowaniem pikseli EvaluateAttributeSnapped
parametr przesunięcia jest w stanie określić szerszy zakres lokalizacji. Parametr przesunięcia wybiera siatkę 16x16 dla każdego drobnego piksela i istnieje wiele drobnych pikseli. Czytelny zakres i liczba użytych bitów zależy od grubszego rozmiaru pikseli. Uwzględnione są górne i lewe krawędzie grubego piksela, a dolne i prawe krawędzie nie.
W poniższej tabeli opisano interpretację parametru przesunięcia EvaluateAttributeSnapped
dla każdego grubego rozmiaru pikseli.
Zakres przesunięcia EvaluateAttributeSnapped
Gruby rozmiar pikseli | Zakres indeksowalny | Możliwy do reprezentowania rozmiar zakresu | Liczba bitów potrzebnych {x, y} | Maska binarna bitów do użycia |
---|---|---|---|---|
1x1 (grzywna) | {[-8, 7], [-8, 7]} | {16, 16} | {4, 4} | {0000000000000xxxx, 0000000000xxxx} |
1x2 | {[-8, 7], [-16, 15]} | {16, 32} | {4, 5} | {0000000000000xxxx, 00000000000xxxxx} |
2x1 | {[-16, 15], [-8, 7]} | {32, 16} | {5, 4} | {000000000000xxxxx, 0000000000xxxx} |
2x2 | {[-16, 15], [-16, 15]} | {32, 32} | {5, 5} | {000000000000xxxxx, 00000000000xxxxx} |
2x4 | {[-16, 15], [-32, 31]} | {32, 64} | {5, 6} | {000000000000xxxxx, 000000000xxxxxx} |
4x2 | {[-32, 31], [-16, 15]} | {64, 32} | {6, 5} | {0000000000xxxxxx, 000000000000xxxxx} |
4x4 | {[-32, 31], [-32, 31]} | {64, 64} | {6, 6} | {0000000000xxxxxx, 000000000xxxxxx} |
Poniższe tabele są przewodnikiem konwersji na od stałego punktu do reprezentacji dziesiętnej i ułamkowej. Pierwszy do użycia bit w masce binarnej jest bitem znaku, a reszta maski binarnej składa się z części liczbowej.
Schemat liczbowy dla wartości cztero bitowych przekazywanych do EvaluateAttributeSnapped
nie jest specyficzny dla cieniowania zmiennej szybkości. Powtórzyliśmy to tutaj za kompletność.
W przypadku wartości cztero bitowych.
Wartość binarna | Dziesiętny | Ułamków |
---|---|---|
1000 | -0.5f | -8 / 16 |
1001 | -0.4375f | -7 / 16 |
1010 | -0,375f | -6 / 16 |
1011 | -0.3125f | -5 / 16 |
1100 | -0.25f | -4 / 16 |
1101 | -0.1875f | -3 / 16 |
1110 | -0.125f | -2 / 16 |
1111 | -0.0625f | -1 /16 |
0000 | 0.0f | 0 / 16 |
0001 | -0.0625f | 1 / 16 |
0010 | -0.125f | 2 / 16 |
0011 | -0.1875f | 3 / 16 |
0100 | -0.25f | 4 / 16 |
0101 | -0.3125f | 5 / 16 |
0110 | -0,375f | 6 / 16 |
0111 | -0.4375f | 7 / 16 |
W przypadku wartości pięcio bitowych.
Wartość binarna | Dziesiętny | Ułamków |
---|---|---|
10000 | -1 | -16 / 16 |
10001 | -0.9375 | -15 / 16 |
10010 | -0.875 | -14 / 16 |
10011 | -0.8125 | -13 / 16 |
10100 | -0.75 | -12 / 16 |
10101 | -0.6875 | -11 / 16 |
10110 | -0.625 | -10 / 16 |
10111 | -0.5625 | -9 / 16 |
11000 | -0.5 | -8 / 16 |
11001 | -0.4375 | -7 / 16 |
11010 | -0.375 | -6 / 16 |
11011 | -0.3125 | -5 / 16 |
11100 | -0.25 | -4 / 16 |
11101 | -0.1875 | -3 / 16 |
11110 | -0.125 | -2 / 16 |
11111 | -0.0625 | -1 / 16 |
00000 | 0 | 0 / 16 |
00001 | 0.0625 | 1 / 16 |
00010 | 0.125 | 2 / 16 |
00011 | 0.1875 | 3 / 16 |
00100 | 0.25 | 4 / 16 |
00101 | 0.3125 | 5 / 16 |
00110 | 0.375 | 6 / 16 |
00111 | 0.4375 | 7 / 16 |
01000 | 0.5 | 8 / 16 |
01001 | 0.5625 | 9 / 16 |
01010 | 0.625 | 10 / 16 |
01011 | 0.6875 | 11 / 16 |
01100 | 0.75 | 12 / 16 |
01101 | 0.8125 | 13 / 16 |
01110 | 0.875 | 14 / 16 |
01111 | 0.9375 | 15 / 16 |
W przypadku wartości sześcio bitowych.
Wartość binarna | Dziesiętny | Ułamków |
---|---|---|
100000 | -2 | -32 / 16 |
100001 | -1.9375 | -31 / 16 |
100010 | -1.875 | -30 / 16 |
100011 | -1.8125 | -29 / 16 |
100100 | -1.75 | -28 / 16 |
100101 | -1.6875 | -27 / 16 |
100110 | -1.625 | -26 / 16 |
100111 | -1.5625 | -25 / 16 |
101000 | -1.5 | -24 / 16 |
101001 | -1.4375 | -23 / 16 |
101010 | -1.375 | -22 / 16 |
101011 | -1.3125 | -21 / 16 |
101100 | -1.25 | -20 / 16 |
101101 | -1.1875 | -19 / 16 |
101110 | -1.125 | -18 / 16 |
101111 | -1.0625 | -17 / 16 |
110000 | -1 | -16 / 16 |
110001 | -0.9375 | -15 / 16 |
110010 | -0.875 | -14 / 16 |
110011 | -0.8125 | -13 / 16 |
110100 | -0.75 | -12 / 16 |
110101 | -0.6875 | -11 / 16 |
110110 | -0.625 | -10 / 16 |
110111 | -0.5625 | -9 / 16 |
111000 | -0.5 | -8 / 16 |
111001 | -0.4375 | -7 / 16 |
111010 | -0.375 | -6 / 16 |
111011 | -0.3125 | -5 / 16 |
111100 | -0.25 | -4 / 16 |
111101 | -0.1875 | -3 / 16 |
111110 | -0.125 | -2 / 16 |
111111 | -0.0625 | -1 / 16 |
000000 | 0 | 0 / 16 |
000001 | 0.0625 | 1 / 16 |
000010 | 0.125 | 2 / 16 |
000011 | 0.1875 | 3 / 16 |
000100 | 0.25 | 4 / 16 |
000101 | 0.3125 | 5 / 16 |
000110 | 0.375 | 6 / 16 |
000111 | 0.4375 | 7 / 16 |
001000 | 0.5 | 8 / 16 |
001001 | 0.5625 | 9 / 16 |
001010 | 0.625 | 10 / 16 |
001011 | 0.6875 | 11 / 16 |
001100 | 0.75 | 12 / 16 |
001101 | 0.8125 | 13 / 16 |
001110 | 0.875 | 14 / 16 |
001111 | 0.9375 | 15 / 16 |
010000 | 1 | 16 / 16 |
010001 | 1.0625 | 17 / 16 |
010010 | 1.125 | 18 / 16 |
010011 | 1.1875 | 19 / 16 |
010100 | 1.25 | 20 / 16 |
010101 | 1.3125 | 21 / 16 |
010110 | 1.375 | 22 / 16 |
010111 | 1.4375 | 23 / 16 |
011000 | 1.5 | 24 / 16 |
011001 | 1.5625 | 25 / 16 |
011010 | 1.625 | 26 / 16 |
011011 | 1.6875 | 27 / 16 |
011100 | 1.75 | 28 / 16 |
011101 | 1.8125 | 29 / 16 |
011110 | 1.875 | 30 / 16 |
011111 | 1.9375 | 31 / 16 |
W taki sam sposób, jak w przypadku drobnych pikseli, EvaluateAttributeSnapped
siatka ocenialnych lokalizacji jest wyśrodkowana w grubym centrum pikseli podczas korzystania z grubszych cieniowania pikseli.
SetSamplePositions
Gdy interfejs API ID3D12GraphicsCommandList1::SetSamplePositions jest używany z grubym cieniowaniem, interfejs API ustawia przykładowe pozycje dla drobnych pikseli.
SV_Coverage
Jeśli SV_Coverage
jest zadeklarowana jako dane wejściowe lub wyjściowe cieniowania w warstwie 1, cieniowanie grubszych pikseli jest wyłączone.
Można użyć semantyki SV_Coverage
z grubszym cieniowaniem pikseli w warstwie 2 i odzwierciedla, które próbki celu MSAA są zapisywane.
Gdy jest używane grubsze cieniowanie pikseli — dzięki czemu wiele pikseli źródłowych składa się z kafelka — maska pokrycia reprezentuje wszystkie próbki pochodzące z tego kafelka.
Biorąc pod uwagę zgodność grubszych cieniowania pikseli z usługą MSAA, liczba bitów pokrycia, które należy określić, może się różnić. Na przykład przy użyciu zasobu MSAA 4x przy użyciu D3D12_SHADING_RATE_2x2każdy gruby piksel zapisuje do czterech drobnych pikseli, a każdy drobny piksel ma cztery próbki. Oznacza to, że każdy gruby piksel zapisuje w sumie 4 * 4 = 16 próbek.
Wymagana liczba bitów pokrycia
Poniższa tabela wskazuje, ile bitów pokrycia jest potrzebnych dla każdej kombinacji grubszego rozmiaru pikseli i poziomu MSAA.
Jak wskazano w tabeli, nie można używać grubych pikseli do zapisu w ponad 16 próbkach w czasie przy użyciu funkcji cieniowania o zmiennej szybkości uwidocznionej za pośrednictwem direct3D 12. To ograniczenie jest spowodowane ograniczeniami direct3D 12 dotyczącymi tego, które poziomy MSAA są dozwolone z grubszym rozmiarem pikseli (zobacz tabelę w z cieniowaniem zmiennym (VRS) w tym temacie).
Porządkowanie i formatowanie bitów w masce pokrycia
Bity maski pokrycia są zgodne z dobrze zdefiniowaną kolejnością. Maska składa się z pokrycia od pikseli od lewej do prawej, a następnie od góry do dołu (kolumna główna) kolejności. Bity pokrycia to bity o niskiej kolejności semantyki pokrycia i są gęsto pakowane razem.
W poniższej tabeli przedstawiono format maski pokrycia dla obsługiwanych kombinacji grubszego rozmiaru pikseli i poziomu MSAA.
W poniższej tabeli przedstawiono 2x pikseli MSAA, gdzie każdy piksel ma dwie próbki indeksów 0 i 1.
Pozycjonowanie etykiet próbek na pikselach jest przeznaczone do celów ilustracyjnych i niekoniecznie przekazuje przestrzenne lokalizacje {X, Y} próbek w tym pikselu; szczególnie biorąc pod uwagę, że przykładowe pozycje mogą być zmieniane programowo. Przykłady są określane przez ich indeks oparty na 0.
W poniższej tabeli przedstawiono 4x pikseli MSAA, gdzie każdy piksel ma cztery próbki indeksów 0, 1, 2 i 3.
Odrzucić
Gdy semantyczna discard
HLSL jest używana z grubszym cieniowaniem pikseli, grube piksele są odrzucane.
Rasteryzacja niezależna od celu (TIR)
Tir nie jest obsługiwany, gdy używane jest grubsze cieniowanie pikseli.
Widoki kolejności rasterów (ROV)
Interlocki ROV są określane jako działające z precyzyjnym stopniem szczegółowości pikseli. Jeśli cieniowanie jest wykonywane na próbkę, interlocks działają na poziomie szczegółowości próbki.
Konserwatywna rasteryzacja
Można użyć konserwatywnej rasteryzacji ze zmienną szybkością cieniowania. Gdy konserwatywna rasteryzacja jest używana z grubszym cieniowaniem pikseli, drobne piksele w grubych pikselach są konserwatywnie rasteryzowane przez nadanie pełnego pokrycia.
Pokrycia
Gdy jest używana konserwatywna rasteryzacja, semantyka pokrycia zawiera pełne maski dla drobnych pikseli, które są pokryte, i 0 dla drobnych pikseli, które nie są pokryte.
Wiązki
Interfejsy API cieniowania o zmiennej szybkości można wywoływać w pakiecie.
Renderowanie przebiegów
Interfejsy API cieniowania o zmiennej szybkości można wywołać w renderowania przekazywania.
Wywoływanie interfejsów API VRS
W następnej sekcji opisano sposób, w jaki cieniowanie zmiennej szybkości jest dostępne dla aplikacji za pośrednictwem usługi Direct3D 12.
Wykonywanie zapytań dotyczących możliwości
Aby wykonać zapytanie dotyczące funkcji cieniowania zmiennej szybkości karty, wywołaj metodę ID3D12Device::CheckFeatureSupport z D3D12_FEATURE::D 3D12_FEATURE_D3D12_OPTIONS6i podaj D3D12_FEATURE_DATA_D3D12_OPTIONS6 strukturę dla funkcji do wypełnienia. Struktura D3D12_FEATURE_DATA_D3D12_OPTIONS6 zawiera kilka elementów członkowskich, w tym jeden z wyliczonego typu D3D12_VARIABLE_SHADING_RATE_TIER (D3D12_FEATURE_DATA_D3D12_OPTIONS6::VariableShadingRateTier) i jeden, który wskazuje, czy przetwarzanie w tle jest obsługiwane (D3D12_FEATURE_DATA_D3D12_OPTIONS6::BackgroundProcessingSupported).
Aby na przykład wykonać zapytanie dotyczące możliwości warstwy 1, możesz to zrobić.
D3D12_FEATURE_DATA_D3D12_OPTIONS6 options;
return
SUCCEEDED(m_device->CheckFeatureSupport(
D3D12_FEATURE_D3D12_OPTIONS6,
&options,
sizeof(options))) &&
options.ShadingRateTier == D3D12_VARIABLE_SHADING_RATE_TIER_1;
Współczynniki cieniowania
Wartości w wyliczenia D3D12_SHADING_RATE są zorganizowane tak, aby współczynniki cieniowania można łatwo rozkładać na dwie osie, gdzie wartości każdej osi są kompaktowo reprezentowane w przestrzeni logarytmicznych zgodnie z D3D12_AXIS_SHADING_RATE wyliczenia.
Możesz utworzyć makro, aby utworzyć dwa współczynniki cieniowania osi w taki sposób, jak to.
#define D3D12_MAKE_COARSE_SHADING_RATE(x,y) ((x) << 2 | (y))
D3D12_MAKE_COARSE_SHADING_RATE(
D3D12_AXIS_SHADING_RATE_2X,
D3D12_AXIS_SHADING_RATE_1X)
Platforma udostępnia również te makra zdefiniowane w d3d12.h
.
#define D3D12_GET_COARSE_SHADING_RATE_X_AXIS(x) ((x) >> 2 )
#define D3D12_GET_COARSE_SHADING_RATE_Y_AXIS(y) ((y) & 3 )
Mogą one służyć do rozbicie i zrozumienie SV_ShaderRate
.
Nuta
Ta interpretacja danych jest kierowana do opisywania obrazu obszaru ekranu, który można manipulować cieniowaniem. Omówiono to dokładniej w powyższych sekcjach. Nie ma jednak powodu, aby nie mieć spójnej definicji grubszych rozmiarów pikseli, które mają być używane wszędzie, w tym podczas ustawiania współczynnika cieniowania na poziomie polecenia.
Ustawianie współczynnika cieniowania na poziomie polecenia i kombinatorów
Współczynnik cieniowania i opcjonalnie kombinatory są określane za pośrednictwem metody ID3D12GraphicsCommandList5::RSSetShadingRate. Przekazujesz wartość D3D12_SHADING_RATE dla współczynnika cieniowania podstawowego i opcjonalną tablicę wartości D3D12_SHADING_RATE_COMBINER.
Przygotowywanie obrazu obszaru ekranu
Stan zasobu tylko do odczytu wyznaczający obraz współczynnika cieniowania do użycia jest zdefiniowany jako D3D12_RESOURCE_STATES::D 3D12_RESOURCE_STATE_SHADING_RATE_SOURCE.
Ustawianie obrazu obszaru ekranu
Obraz obszaru ekranu można określić za pomocą metody ID3D12GraphicsCommandList5::RSSetShadingRateImage.
m_commandList->RSSetShadingRateImage(screenSpaceImage);
Wykonywanie zapytań dotyczących rozmiaru kafelka
Rozmiar kafelka można wykonać względem elementu członkowskiego D3D12_FEATURE_DATA_D3D12_OPTIONS6::ShadingRateImageTileSize. Zobacz Możliwości wykonywania zapytań powyżej.
Pobierany jest jeden wymiar, ponieważ wymiary poziome i pionowe są zawsze takie same. Jeśli możliwości systemu są D3D12_SHADING_RATE_TIER_NOT_SUPPORTED, zwracany rozmiar kafelka to 0.