Condividi tramite


Ombreggiatura a frequenza variabile (VRS)

La motivazione per VRS

A causa dei vincoli di prestazioni, un renderer di grafica non può sempre permettersi di offrire lo stesso livello di qualità a ogni parte dell'immagine di output. L'ombreggiatura a frequenza variabile, o l'ombreggiatura in pixel grossolana, è un meccanismo che consente di allocare prestazioni/potenza di rendering a velocità che variano in base all'immagine di cui è stato eseguito il rendering.

In alcuni casi, la velocità di ombreggiatura può essere ridotta con poca o nessuna riduzione della qualità di output percepibile; con un miglioramento delle prestazioni essenzialmente gratuito.

Senza VRS: anti-aliasing multicampionamento con supercampionamento

Senza l'ombreggiatura a frequenza variabile, l'unico mezzo per controllare la frequenza di ombreggiatura è l'anti-aliasing multicampionamento (MSAA) con l'esecuzione basata su campione (nota anche come supercampionamento).

MSAA è un meccanismo per ridurre l'aliasing geometrico e migliorare la qualità di rendering di un'immagine rispetto all'uso di MSAA. Il numero di campioni MSAA, che può essere 1x, 2x, 4x, 8x o 16x, determina il numero di campioni allocati per ogni pixel di destinazione di rendering. Il conteggio dei campioni MSAA deve essere noto in anticipo quando la destinazione viene allocata e non può essere modificata successivamente.

Il supercampionamento fa sì che il pixel shader venga richiamato una volta per campione, con una qualità più elevata, ma anche un costo di prestazioni superiore rispetto all'esecuzione per pixel.

L'applicazione può controllare la frequenza di ombreggiatura scegliendo tra esecuzione basata su pixel o MSAA-with-supersampling. Queste due opzioni non forniscono un controllo molto fine. Inoltre, è possibile che si voglia una velocità di ombreggiatura inferiore per una determinata classe di oggetti rispetto al resto dell'immagine. Tali oggetti possono includere un oggetto dietro un elemento HUD o una trasparenza, una sfocatura (profondità di campo, movimento e così via) o una distorsione ottica dovuta all'ottica VR. Ma questo non sarebbe possibile, perché la qualità e i costi dell'ombreggiatura sono fissi sull'intera immagine.

Con ombreggiatura a frequenza variabile (VRS)

Il modello VRS (Variable Rate Shading) estende supersampling-with-MSAA nell'opposto, "pixel grossolano", direzione, aggiungendo il concetto di ombreggiatura grossolana. Questa è la posizione in cui è possibile eseguire l'ombreggiatura a una frequenza più grossolana di un pixel. In altre parole, un gruppo di pixel può essere ombreggiato come una singola unità e il risultato viene quindi trasmesso a tutti i campioni del gruppo.

Un'API di ombreggiatura grossolana consente all'applicazione di specificare il numero di pixel appartenenti a un gruppo ombreggiato o pixel grossolano. È possibile variare le dimensioni del pixel grossolano dopo aver allocato la destinazione di rendering. Quindi, parti diverse dello schermo o passaggi di disegno diversi possono avere frequenze di ombreggiatura diverse.

Di seguito è riportata una tabella che descrive il livello MSAA supportato con le dimensioni grossolane dei pixel, per le piattaforme che supportano l'ombreggiatura grossolana:

  • Per le celle contrassegnate Y, tale combinazione è abilitata.
  • Per le celle contrassegnate cap, tale combinazione è abilitata in modo condizionale in base a un limite (AdditionalShadingRatesSupported).
  • Per le celle vuote, tale combinazione non è supportata.
  • Per le celle ombreggiate da metàtone, tale combinazione non è supportata, e prevede il rilevamento di più di 16 campioni per chiamata al pixel shader. Per tenere traccia di più di 16 campioni sono presenti ulteriori barriere di allineamento hardware da supportare, rispetto agli altri casi.

Tabella mostra le dimensioni grossolane dei pixel per i livelli M A A.

Livelli di funzionalità

Esistono due livelli per l'implementazione di VRS e due funzionalità per cui è possibile eseguire query. Ogni livello viene descritto in modo più dettagliato dopo la tabella.

Tabella mostra le funzionalità disponibili nel livello 1 e nel livello 2. livelli VRS

Livello 1

  • La velocità di ombreggiatura può essere specificata solo in base al disegno; non più granulare di questo.
  • La velocità di ombreggiatura si applica in modo uniforme a ciò che viene disegnato indipendentemente da dove si trova all'interno della destinazione di rendering.

Livello 2

  • La velocità di ombreggiatura può essere specificata in base al disegno, come nel livello 1. Può anche essere specificato da una combinazione di base per disegno e di:
    • Semantica da ogni vertice provocatore e
    • un'immagine dello spazio sullo schermo.
  • Le frequenze di ombreggiatura delle tre origini vengono combinate usando un set di combinatori.
  • Le dimensioni del riquadro dell'immagine dello spazio sullo schermo sono 16x16 o inferiori.
  • La frequenza di ombreggiatura richiesta dall'applicazione è garantita esattamente (per la precisione dei filtri temporali e di altri filtri di ricostruzione).
  • SV_ShadingRate input PS è supportato.
  • La frequenza di ombreggiatura per ogni vertice provocante (nota anche come per primitiva) è valida quando viene usato un viewport e SV_ViewportArrayIndex non viene scritto in .
  • La frequenza dei vertici per ogni causa può essere usata con più di un viewport se la SupportsPerVertexShadingRateWithMultipleViewports funzionalità è impostata su true. Inoltre, in tal caso, tale frequenza può essere usata quando SV_ViewportArrayIndex viene scritto in .

Elenco delle funzionalità

  • additionalShadingRatesSupported
    • Tipo booleano.
    • Indica se le dimensioni di 2x4, 4x2 e 4x4 pixel grossolane sono supportate per il rendering a campione singolo; e se le dimensioni del pixel grossolano 2x4 sono supportate per 2x MSAA.
  • SupportsPerVertexShadingRateWithMultipleViewports
    • Tipo booleano.
    • Indica se è possibile usare più di un viewport con la frequenza di ombreggiatura per vertice (nota anche come per primitiva).

Specifica della frequenza di ombreggiatura

Per la flessibilità nelle applicazioni, sono disponibili diversi meccanismi per controllare la frequenza di ombreggiatura. Sono disponibili meccanismi diversi a seconda del livello di funzionalità hardware.

Elenco comandi

Questo è il meccanismo più semplice per impostare la frequenza di ombreggiatura. È disponibile in tutti i livelli.

L'applicazione può specificare una dimensione di pixel grossolana usando il metodo ID3D12GraphicsCommandList5::RSSetShadingRate. Tale API accetta un singolo argomento di enumerazione. L'API fornisce un controllo generale del livello di qualità per il rendering, ovvero la possibilità di impostare la frequenza di ombreggiatura in base al disegno.

I valori per questo stato vengono espressi tramite l'enumerazione D3D12_SHADING_RATE.

Supporto delle dimensioni dei pixel grossolane

Le frequenze di ombreggiatura 1x1, 1x2, 2x1 e 2x2 sono supportate in tutti i livelli.

È disponibile una funzionalità, AdditionalShadingRatesSupported, per indicare se nel dispositivo sono supportati 2x4, 4x2 e 4x4.

Immagine dello spazio dello schermo (basata su immagini)

Nel livello 2 e superiore è possibile specificare la frequenza di ombreggiatura dei pixel con un'immagine dello spazio sullo schermo.

L'immagine dello spazio dello schermo consente all'applicazione di creare un'immagine "maschera di dettaglio (LOD) che indica le aree di qualità variabile, ad esempio le aree che saranno coperte da sfocatura del movimento, sfocatura profondità di campo, oggetti trasparenti o elementi dell'interfaccia utente HUD. La risoluzione dell'immagine si trova in macroblock; non è nella risoluzione della destinazione di rendering. In altre parole, i dati della frequenza di ombreggiatura vengono specificati con una granularità di 8x8 o 16x16 pixel riquadri, come indicato dalle dimensioni del riquadro VRS.

Dimensioni riquadro

L'applicazione può eseguire query su un'API per recuperare le dimensioni del riquadro VRS supportate per il dispositivo.

I riquadri sono quadrati e le dimensioni fanno riferimento alla larghezza o all'altezza del riquadro in texel.

Se l'hardware non supporta l'ombreggiatura a frequenza variabile di livello 2, la query di funzionalità per le dimensioni del riquadro restituisce 0.

Se l'hardware supporta l'ombreggiatura a frequenza variabile di livello 2, le dimensioni del riquadro sono uno di questi valori.

  • 8
  • 16
  • 32

Dimensioni dell'immagine dello spazio dello schermo

Per una destinazione di rendering di dimensioni {rtWidth, rtHeight}, usando una dimensione di riquadro specificata denominata VRSTileSize, l'immagine dello spazio dello schermo che la coprirà è di queste dimensioni.

{ ceil((float)rtWidth / VRSTileSize), ceil((float)rtHeight / VRSTileSize) }

L'immagine dello spazio dello schermo in alto a sinistra (0, 0) è bloccata nella parte superiore sinistra della destinazione di rendering (0, 0).

Per cercare la coordinata (x,y) di un riquadro che corrisponde a una determinata posizione nella destinazione di rendering, dividere le coordinate dello spazio della finestra di (x, y) in base alle dimensioni del riquadro, ignorando i bit frazionari.

Se l'immagine dello spazio dello schermo è più grande di quanto sia necessario per una determinata destinazione di rendering, le parti aggiuntive a destra e/o inferiore non vengono usate.

Se l'immagine dello spazio dello schermo è troppo piccola per una determinata destinazione di rendering, qualsiasi tentativo di lettura dall'immagine oltre gli extent effettivi produce una frequenza di ombreggiatura predefinita pari a 1x1. Ciò è dovuto al fatto che l'immagine in alto a sinistra dello spazio dello schermo (0, 0) è bloccata nella parte superiore sinistra della destinazione di rendering (0, 0) e la "lettura oltre gli extent della destinazione di rendering" significa leggere troppo grandi valori per x e y.

Formato, layout, proprietà delle risorse

Il formato di questa superficie è una superficie a 8 bit a canale singolo (DXGI_FORMAT_R8_UINT).

La risorsa è una dimensione TEXTURE2D.

Non può essere matriceta o mipped. Deve avere un livello mip in modo esplicito.

Ha il numero di campioni 1 e la qualità del campione 0.

Ha layout di trama UNKNOWN. Non può essere in modo implicito il layout principale della riga, perché non è consentito l'adattatore incrociato.

Il modo previsto in cui vengono popolati i dati dell'immagine dello spazio sullo schermo è quello di

  1. Scrivere i dati usando uno shader di calcolo; l'immagine dello spazio dello schermo è associata come UAV o
  2. Copiare i dati nell'immagine dello spazio dello schermo.

Quando si crea l'immagine dello spazio dello schermo, questi flag sono consentiti.

  • NESSUNO
  • ALLOW_UNORDERED_ACCESS
  • DENY_SHADER_RESOURCE

Questi flag non sono consentiti.

  • ALLOW_RENDER_TARGET
  • ALLOW_DEPTH_STENCIL
  • ALLOW_CROSS_ADAPTER
  • ALLOW_SIMULTANEOUS_ACCESS
  • VIDEO_DECODE_REFERENCE_ONLY

Il tipo heap della risorsa non può essere UPLOAD né READBACK.

La risorsa non può essere SIMULTANEOUS_ACCESS. La risorsa non può essere cross-adapter.

Dati

Ogni byte dell'immagine dello spazio dello schermo corrisponde a un valore dell'enumerazione D3D12_SHADING_RATE.

Stato risorsa

Una risorsa deve essere sottoposta a transizione in uno stato di sola lettura quando viene usata come immagine dello spazio dello schermo. A questo scopo viene definito uno stato di sola lettura, D3D12_RESOURCE_STATE_SHADING_RATE_SOURCE, .

La risorsa immagine viene passata da tale stato per diventare nuovamente scrivibile.

Impostazione dell'immagine

L'immagine dello spazio dello schermo per specificare la frequenza dello shader è impostata nell'elenco dei comandi.

Una risorsa impostata come origine della frequenza di ombreggiatura non può essere letta o scritta da qualsiasi fase dello shader.

È possibile impostare un'immagine null spazio sullo schermo per specificare la frequenza dello shader. Questo ha l'effetto di usare 1x1 in modo coerente come contributo dell'immagine dello spazio dello schermo. L'immagine dello spazio sullo schermo può essere inizialmente considerata impostata su null.

Promozione e decadimento

Una risorsa immagine dello spazio sullo schermo non ha implicazioni speciali in relazione alla promozione o al decadimento.

Attributo per primitiva

Un attributo per primitivo aggiunge la possibilità di specificare un termine di frequenza di ombreggiatura come attributo da un vertice che provoca. Questo attributo è ombreggiato in modo flat, ovvero viene propagato a tutti i pixel nella primitiva del triangolo o della linea corrente. L'uso di un attributo per primitivo può abilitare un controllo granulare della qualità dell'immagine rispetto agli altri identificatori di frequenza di ombreggiatura.

L'attributo per primitivo è una semantica impostabile denominata SV_ShadingRate. SV_ShadingRate esiste come parte di modello shader HLSL 6.4.

Se vs o GS imposta SV_ShadingRate, ma VRS non è abilitato, l'impostazione semantica non ha alcun effetto. Se non viene specificato alcun valore per SV_ShadingRate per primitiva, si presuppone che un valore della frequenza di ombreggiatura di 1x1 sia il contributo per primitiva.

Combinazione dei fattori di frequenza di ombreggiatura

Le varie origini della frequenza di ombreggiatura vengono applicate in sequenza usando questo diagramma.

Diagramma mostra uno stato della pipeline, con etichetta A, con frequenza di ombreggiatura dei vertici provocanti, etichettata B, applicata a una combinazione, quindi velocità di ombreggiatura basata su immagine, etichettata B, applicata a un combinatore.

Ogni coppia di A e B viene combinata usando un combinatore.

* Quando si specifica una frequenza shader per attributo vertex.

  • Se viene usato uno shader geometry, è possibile specificare la frequenza di ombreggiatura.
  • Se non viene utilizzato uno shader geometry, la frequenza di ombreggiatura viene specificata dal vertice che provoca.

Elenco di combinatori

Sono supportati i combinatori seguenti. Uso di un combinatore (C) e due input (A e B).

  • pass-through. C.xy = A.xy.
  • eseguire l'override di. C.xy = B.xy.
  • di qualità superiore. C.xy = min(A.xy, B.xy).
  • di qualità inferiore. C.xy = max(A.xy, B.xy).
  • Applicare il costo B rispetto a A. C.xy = min(maxRate, A.xy + B.xy).

dove maxRate è la dimensione massima consentita di pixel grossolani nel dispositivo. Questo sarebbe

  • D3D12_AXIS_SHADING_RATE_2X (ovvero il valore 1), se AdditionalShadingRatesSupported è false.
  • D3D12_AXIS_SHADING_RATE_4X (ovvero un valore pari a 2), se AdditionalShadingRatesSupported è true.

La scelta del combinatore per l'ombreggiatura a frequenza variabile viene impostata nell'elenco dei comandi tramite ID3D12GraphicsCommandList5::RSSetShadingRate.

Se non vengono mai impostati combinatori, rimangono al valore predefinito, ovvero PASSTHROUGH.

Se l'origine di un combinatore è un D3D12_AXIS_SHADING_RATE, che non è consentito nella tabella di supporto, l'input viene sanificato a una velocità di ombreggiatura che è supportata.

Se l'output di un combinatore non corrisponde a una frequenza di ombreggiatura supportata nella piattaforma, il risultato viene sanificato a una velocità di ombreggiatura che è supportata.

Stato predefinito e cancellazione dello stato

Tutte le origini della frequenza di ombreggiatura, vale a essere

  • velocità specificata dallo stato della pipeline (specificata nell'elenco dei comandi),
  • velocità specificata dall'immagine dello spazio dello schermo e
  • attributo per primitiva

per impostazione predefinita D3D12_SHADING_RATE_1X1. I combinatori predefiniti sono {PASSTHROUGH, PASSTHROUGH}.

Se non viene specificata alcuna immagine dello spazio dello schermo, viene dedotta una frequenza di ombreggiatura pari a 1x1 da tale origine.

Se non viene specificato alcun attributo per primitivo, viene dedotto da tale origine una frequenza di ombreggiatura pari a 1x1.

ID3D12CommandList::ClearState reimposta la frequenza specificata dallo stato della pipeline sull'impostazione predefinita e la selezione dell'immagine dello spazio dello schermo sul valore predefinito "nessuna immagine dello spazio sullo schermo".

Esecuzione di query sulla frequenza di ombreggiatura tramite SV_ShadingRate

È utile sapere quale frequenza di ombreggiatura è stata selezionata dall'hardware in una determinata chiamata al pixel shader. Ciò potrebbe consentire un'ampia gamma di ottimizzazioni nel codice PS. Una variabile di sistema solo PS, SV_ShadingRate, fornisce informazioni sulla frequenza di ombreggiatura.

Digitare

Il tipo di questa semantica è uint.

Interpretazione dei dati

I dati vengono interpretati come valore dell'enumerazione D3D12_SHADING_RATE.

Se VRS non viene usato

Se l'ombreggiatura in pixel grossolana non viene usata, SV_ShadingRate viene rilette come valore 1x1, che indica pixel sottili.

Comportamento nell'esecuzione basata su esempio

Una compilazione pixel shader non riesce se inserisce SV_ShadingRate e usa anche l'esecuzione basata su campioni, ad esempio immettendo SV_SampleIndexo usando la parola chiave di interpolazione di esempio.

Osservazioni sull'ombreggiatura posticipata

I passaggi di illuminazione di un'applicazione di ombreggiatura posticipata potrebbero dover sapere quale frequenza di ombreggiatura è stata usata per quale area dello schermo. Questo è in modo che il passaggio di illuminazione dispatch può lanciare a una velocità più grossolana. La variabile SV_ShadingRate può essere usata per eseguire questa operazione se viene scritta nel gbuffer.

Profondità e stencil

Quando viene usata l'ombreggiatura in pixel grossolana, la profondità e lo stencil e la copertura vengono sempre calcolati e generati alla risoluzione completa del campione.

Utilizzo della frequenza di ombreggiatura richiesta

Per tutti i livelli, è previsto che se è richiesta una frequenza di ombreggiatura ed è supportata nella combinazione di livello device-and-MSAA, questa è la frequenza di ombreggiatura fornita dall'hardware.

Una frequenza di ombreggiatura richiesta indica una frequenza di ombreggiatura calcolata come output dei combinatori (vedere la sezione Combinazione dei fattori di frequenza di ombreggiatura in questo argomento).

Una frequenza di ombreggiatura supportata è 1x1, 1x2, 2x1 o 2x2 in un'operazione di rendering in cui il conteggio dei campioni è minore o uguale a quattro. Se la funzionalità di AdditionalShadingRatesSupported è true, 2x4, 4x2 e 4x4 sono supportate anche le frequenze di ombreggiatura per alcuni conteggi dei campioni (vedere la tabella nella sezione With variable-rate shading (VRS) in questo argomento.

Derivati dello spazio dello schermo

I calcoli delle sfumature da pixel a diacente sono influenzati dall'ombreggiatura in pixel grossolana. Ad esempio, quando vengono usati 2x2 pixel grossolani, una sfumatura sarà due volte la dimensione rispetto a quando non vengono usati pixel grossolani. L'applicazione potrebbe voler modificare gli shader per compensare questo problema, o meno, a seconda delle funzionalità desiderate.

Poiché gli mips vengono scelti in base a una derivata dello spazio dello schermo, l'utilizzo dell'ombreggiatura pixel grossolana influisce sulla selezione mip. L'utilizzo dell'ombreggiatura pixel grossolana causa l'selezione di mips meno dettagliati rispetto a quando non vengono utilizzati pixel grossolani.

Interpolazione degli attributi

Gli input in un pixel shader possono essere interpolati in base ai relativi vertici di origine. Poiché l'ombreggiatura a frequenza variabile influisce sulle aree della destinazione scritte da ogni chiamata del pixel shader, interagisce con l'interpolazione degli attributi. I tre tipi di interpolazione sono centro, centroide ed esempio.

Centro

La posizione di interpolazione centrale per un pixel grossolano è il centro geometrico dell'area pixel grossolana completa. SV_Position viene sempre interpolato al centro dell'area pixel grossolana.

Centroide

Quando l'ombreggiatura in pixel grossolana viene usata con MSAA, per ogni pixel fine verranno comunque scritti nel numero completo di campioni allocati per il livello MSAA della destinazione. Pertanto, la posizione di interpolazione centroide considererà tutti i campioni per pixel sottili all'interno di pixel grossolani. Detto questo, la posizione dell'interpolazione centroide è definita come il primo campione coperto, in ordine crescente di indice del campione. La copertura effettiva dell'esempio è AND-ed con il bit corrispondente dello stato del rasterizzatore SampleMask.

Nota

Quando l'ombreggiatura in pixel grossolana viene usata nel livello 1, SampleMask è sempre una maschera completa. Se SampleMask è configurato per non essere una maschera completa, l'ombreggiatura in pixel grossolana è disabilitata nel livello 1.

Esecuzione basata su campioni

L'esecuzione basata su campioni o supercampionamento, che è causata dall'uso della funzionalità di interpolazione del campione, può essere usata con ombreggiatura pixel grossolana e fa sì che il pixel shader venga richiamato per ogni campione. Per le destinazioni del numero di campioni N, il pixel shader viene richiamato N volte per pixel fine.

EvaluateAttributeSnapped

Le funzioni intrinseche del modello pull non sono compatibili con l'ombreggiatura in pixel grossolana nel livello 1. Se si tenta di usare oggetti intrinseci del modello pull con ombreggiatura pixel grossolana nel livello 1, l'ombreggiatura in pixel grossolana viene disabilitata automaticamente.

La EvaluateAttributeSnapped intrinseca può essere usata con ombreggiatura pixel grossolana nel livello 2. La sua sintassi è identica a quella che è sempre stata.

numeric EvaluateAttributeSnapped(	
    in attrib numeric value, 
    in int2 offset);

Per il contesto, EvaluateAttributeSnapped ha un parametro offset con due campi. Se usato senza ombreggiatura in pixel grossolana, vengono usati solo i quattro bit inferiori al di fuori dei trentadue. Questi quattro bit rappresentano l'intervallo [-8, 7]. Questo intervallo si estende su una griglia di 16x16 all'interno di un pixel. L'intervallo è tale che i bordi superiore e sinistro del pixel sono inclusi e i bordi inferiore e destro non sono. L'offset (-8, -8) si trova nell'angolo superiore sinistro e l'offset (7, 7) è nell'angolo inferiore destro. Offset (0, 0) è il centro del pixel.

Se usato con ombreggiatura pixel grossolana, EvaluateAttributeSnappedparametro offset è in grado di specificare una gamma più ampia di posizioni. Il parametro offset seleziona una griglia di 16x16 per ogni pixel fine e sono presenti più pixel sottili. L'intervallo expressible e il conseguente numero di bit utilizzati dipendono dalla dimensione grossolana del pixel. I bordi superiore e sinistro del pixel grossolano sono inclusi e i bordi inferiore e destro non sono.

La tabella seguente descrive l'interpretazione del parametro offset di EvaluateAttributeSnappedper ogni dimensione di pixel grossolana.

Intervallo di offset evaluateAttributeSnapped

Dimensioni pixel grossolane Intervallo indicizzabile Dimensioni dell'intervallo rappresentabili Numero di bit necessari {x, y} Maschera binaria di bit utilizzabili
1x1 (fine) {[-8, 7], [-8, 7]} {16, 16} {4, 4} {000000000000xxxx, 00000000000xxxx}
1x2 {[-8, 7], [-16, 15]} {16, 32} {4, 5} {000000000000xxxx, 0000000000xxxxx}
2x1 {[-16, 15], [-8, 7]} {32, 16} {5, 4} {00000000000xxxxx, 00000000000xxxx}
2x2 {[-16, 15], [-16, 15]} {32, 32} {5, 5} {00000000000xxxxx, 0000000000xxxxx}
2x4 {[-16, 15], [-32, 31]} {32, 64} {5, 6} {0000000000xxxxx, 000000000xxxxxx}
4x2 {[-32, 31], [-16, 15]} {64, 32} {6, 5} {0000000000xxxxxx, 0000000000xxxxx}
4x4 {[-32, 31], [-32, 31]} {64, 64} {6, 6} {0000000000xxxxxx, 000000000xxx}

Le tabelle seguenti sono una guida per la conversione da una rappresentazione decimale a decimale e frazionaria. Il primo bit utilizzabile nella maschera binaria è il bit del segno e il resto della maschera binaria comprende la parte numerica.

Lo schema numerico per i valori a quattro bit passati a EvaluateAttributeSnapped non è specifico dell'ombreggiatura a frequenza variabile. Qui viene ripetuto per completezza.

Per i valori a quattro bit.

Valore binario Decimale Frazionario
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

Per i valori a cinque bit.

Valore binario Decimale Frazionario
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

Per i valori a sei bit.

Valore binario Decimale Frazionario
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

Allo stesso modo dei pixel sottili, EvaluateAttributeSnappedgriglia di posizioni valutabili viene allineata al centro del pixel grossolano quando si usa l'ombreggiatura pixel grossolana.

SetSamplePositions

Quando l'API ID3D12GraphicsCommandList1::SetSamplePositions viene usata con ombreggiatura grossolana, l'API imposta le posizioni di esempio per pixel sottili.

SV_Coverage

Se SV_Coverage viene dichiarato come input o output dello shader nel livello 1, l'ombreggiatura in pixel grossolana è disabilitata.

È possibile usare la semantica SV_Coverage con ombreggiatura pixel grossolana nel livello 2 e riflette i campioni di una destinazione MSAA da scrivere.

Quando si usa l'ombreggiatura pixel grossolana, consentendo a più pixel di origine di includere un riquadro, la maschera di copertura rappresenta tutti i campioni provenienti da tale riquadro.

Data la compatibilità dell'ombreggiatura dei pixel grossolani con MSAA, il numero di bit di copertura da specificare può variare. Ad esempio, con una risorsa MSAA 4x usando D3D12_SHADING_RATE_2x2, ogni pixel grossolano scrive in quattro pixel sottili e ogni pixel fine ha quattro campioni. Ciò significa che ogni pixel grossolano scrive in un totale di 4 * 4 = 16 campioni.

Numero di bit di copertura necessari

La tabella seguente indica il numero di bit di copertura necessari per ogni combinazione di dimensioni di pixel grossolane e livello MSAA.

Tabella mostra le dimensioni grossolane dei pixel, il numero di pixel sottili e i livelli MS A A. bit di copertura

Come indicato nella tabella, non è possibile usare pixel grossolani per scrivere in più di 16 campioni alla volta usando la funzionalità di ombreggiatura a frequenza variabile esposta tramite Direct3D 12. Questa restrizione è dovuta ai vincoli di Direct3D 12 relativi ai livelli MSAA consentiti con cui sono consentiti pixel grossolani (vedere la tabella nell'Con l'ombreggiatura a frequenza variabile (VRS) sezione in questo argomento.

Ordinamento e formato dei bit nella maschera di copertura

I bit della maschera di copertura rispettano un ordine ben definito. La maschera è costituita da code da pixel da sinistra a destra, quindi dall'alto verso il basso (ordine principale colonna). I bit di copertura sono i bit a basso ordine della semantica di copertura e sono densamente compressi.

La tabella seguente mostra il formato della maschera di copertura per le combinazioni supportate di dimensioni di pixel grossolane e livello MSAA.

Tabella mostra le dimensioni grossolane dei pixel, il diagramma pixel grossolano e i bit di copertura 1 x M S A A.

La tabella seguente illustra 2x MSAA pixel, dove ogni pixel ha due campioni di indici 0 e 1.

Il posizionamento delle etichette dei campioni sui pixel è a scopo illustrativo e non trasmette necessariamente le posizioni spaziali di {X, Y} su tale pixel; soprattutto dato che le posizioni di esempio possono essere modificate a livello di codice. I campioni vengono indicati dal relativo indice basato su 0.

Tabella mostra le dimensioni grossolane dei pixel, il diagramma pixel grossolano e i bit di copertura A A a 2 x M.

La tabella seguente mostra 4x MSAA pixel, in cui ogni pixel ha quattro campioni di indici 0, 1, 2 e 3.

Tabella mostra le dimensioni grossolane dei pixel, il diagramma pixel grossolano e i bit di copertura 4 x M A A. copertura

Scartare

Quando il discard semantico HLSL viene usato con ombreggiatura pixel grossolana, i pixel grossolani vengono eliminati.

Rasterizzazione indipendente dalla destinazione (TIR)

L'ombreggiatura in pixel grossolana non è supportata.

Visualizzazioni degli ordini raster (ROV)

Gli interlock ROV vengono specificati come operativi con granularità in pixel fine. Se l'ombreggiatura viene eseguita per campione, gli interlock vengono eseguiti a livello di granularità del campione.

Rasterizzazione conservativa

È possibile usare la rasterizzazione conservativa con ombreggiatura a frequenza variabile. Quando la rasterizzazione conservativa viene usata con ombreggiatura di pixel grossolani, i pixel sottili all'interno dei pixel grossolani vengono rasterizzati in modo conservativo fornendo una copertura completa.

Copertura

Quando viene usata la rasterizzazione conservativa, la semantica di copertura contiene maschere complete per pixel sottili coperti e 0 per pixel sottili non coperti.

Pacchetti

È possibile chiamare API di ombreggiatura a frequenza variabile in un bundle.

Passaggi di rendering

È possibile chiamare api di ombreggiatura a frequenza variabile in un passaggio di rendering .

Chiamata delle API VRS

Questa sezione successiva descrive il modo in cui l'ombreggiatura a frequenza variabile è accessibile all'applicazione tramite Direct3D 12.

Esecuzione di query sulle funzionalità

Per eseguire una query sulla funzionalità di ombreggiatura a frequenza variabile dell'adattatore, chiamare ID3D12Device::CheckFeatureSupport con D3D12_FEATURE::D 3D12_FEATURE_D3D12_OPTIONS6e fornire una struttura D3D12_FEATURE_DATA_D3D12_OPTIONS6 per la funzione da compilare automaticamente. La struttura D3D12_FEATURE_DATA_D3D12_OPTIONS6 contiene diversi membri, tra cui uno del tipo enumerato D3D12_VARIABLE_SHADING_RATE_TIER (D3D12_FEATURE_DATA_D3D12_OPTIONS6::VariableShadingRateTier) e uno che indica se l'elaborazione in background è supportata (D3D12_FEATURE_DATA_D3D12_OPTIONS6::BackgroundProcessingSupported).

Per eseguire una query per la funzionalità di livello 1, ad esempio, è possibile eseguire questa operazione.

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;

Tassi di ombreggiatura

I valori nell'enumerazione D3D12_SHADING_RATE sono organizzati in modo che le frequenze di ombreggiatura siano facilmente componibili in due assi, in cui i valori di ogni asse vengono rappresentati in modo compatto nello spazio logaritmico in base all'enumerazione D3D12_AXIS_SHADING_RATE.

È possibile creare una macro per comporre due frequenze di ombreggiatura dell'asse in una frequenza di ombreggiatura simile alla seguente.

#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)

La piattaforma fornisce anche queste macro, definite in d3d12.h.

#define D3D12_GET_COARSE_SHADING_RATE_X_AXIS(x) ((x) >> 2 )
#define D3D12_GET_COARSE_SHADING_RATE_Y_AXIS(y) ((y) & 3 )

Queste possono essere usate per disezionare e comprendere SV_ShaderRate.

Nota

Questa interpretazione dei dati è orientata alla descrizione dell'immagine dello spazio dello schermo, che può essere modificata dagli shader. Questo argomento è illustrato più avanti nelle sezioni precedenti. Ma non c'è motivo di avere una definizione coerente delle dimensioni dei pixel grossolani da usare ovunque, incluso quando si imposta la frequenza di ombreggiatura a livello di comando.

Impostazione della frequenza di ombreggiatura e dei combinatori a livello di comando

La frequenza di ombreggiatura e, facoltativamente, i combinatori vengono specificati tramite il metodo ID3D12GraphicsCommandList5::RSSetShadingRate. Si passa un valore D3D12_SHADING_RATE per la frequenza di ombreggiatura di base e una matrice facoltativa di valori D3D12_SHADING_RATE_COMBINER.

Preparazione dell'immagine dello spazio dello schermo

Lo stato della risorsa di sola lettura che designa un'immagine di frequenza di ombreggiatura utilizzabile viene definita come D3D12_RESOURCE_STATES::D 3D12_RESOURCE_STATE_SHADING_RATE_SOURCE.

Impostazione dell'immagine dello spazio dello schermo

È possibile specificare l'immagine dello spazio sullo schermo tramite il metodo ID3D12GraphicsCommandList5::RSSetShadingRateImage.

m_commandList->RSSetShadingRateImage(screenSpaceImage);

Esecuzione di query sulle dimensioni del riquadro

È possibile eseguire query sulle dimensioni del riquadro dal membro D3D12_FEATURE_DATA_D3D12_OPTIONS6::ShadingRateImageTileSize. Vedere Funzionalità di query precedenti.

Viene recuperata una dimensione, poiché le dimensioni orizzontali e verticali sono sempre uguali. Se la funzionalità del sistema è D3D12_SHADING_RATE_TIER_NOT_SUPPORTED, la dimensione del riquadro restituita è 0.