Udostępnij za pośrednictwem


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.

Tabela pokazuje grubszy rozmiar pikseli dla poziomów M S A A.

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.

Tabela zawiera funkcje dostępne w warstwie 1 i warstwie 2. 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 zapisywania SV_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:

  1. Zapisywanie danych przy użyciu cieniowania obliczeniowego; obraz obszaru ekranu jest powiązany jako UAV lub
  2. 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.

Diagram przedstawia stan potoku z etykietą A z współczynnikiem cieniowania wierzchołków prowokujących, oznaczonym etykietą B, zastosowanym w połączeniu, a następnie współczynnik cieniowania opartym na obrazach, oznaczonym etykietą B, zastosowanym w połączeniu.

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_SampleIndexlub 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 EvaluateAttributeSnappedparametr 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 EvaluateAttributeSnappeddla 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, EvaluateAttributeSnappedsiatka 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.

Tabela pokazuje grubszy rozmiar pikseli, liczbę drobnych pikseli i poziomy A S S A. bity pokrycia

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.

Tabela przedstawia grubszy rozmiar pikseli, gruby diagram pikseli i 1 x bitów pokrycia S S A. pokrycie

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.

Tabela przedstawia grubszy rozmiar pikseli, gruby diagram pikseli i 2 x bity pokrycia S S A. pokrycie

W poniższej tabeli przedstawiono 4x pikseli MSAA, gdzie każdy piksel ma cztery próbki indeksów 0, 1, 2 i 3.

Tabela przedstawia grubszy rozmiar pikseli, grubszy diagram pikseli i 4 x bity pokrycia S S A. pokrycie

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.