Cosa sono i derivati ​​dello spazio dello schermo e quando li dovrei usare?


12

Vedo le funzioni ddxe ddyglsl e gli equivalenti hlsl che appaiono ogni tanto nel codice shader. Attualmente li sto usando per eseguire il bump mapping senza tangente o bitangente, ma sostanzialmente ho incollato il codice. Non capisco cosa siano realmente queste funzioni, cosa facciano e quando cercherò di usarle.

Quindi domande:

  1. Quali sono le funzioni dei derivati ​​dello schermo?
  2. Cosa fanno queste funzioni? I valori di input e valori di output
  3. Per quali effetti sono più comunemente usati?
  4. Che tipo di effetti richiedono che tu guardi a queste funzioni?

In passato li ho usati per orditi di trama, dove l'ordito potrebbe causare la selezione del miplevel sbagliato per alcuni frammenti; in genere un livello miple più basso, in modo da poter vedere la trama cambiare visibilmente i dettagli mentre si deforma. Prendere i derivati ​​dei texcoords non deformati, quindi calcolare l'ordito, quindi usare tex2Dgrad / SampleGrad / textureGrad con i texcoords deformati e i derivati ​​impedisce che ciò accada.
Massimo

@ LeComteduMerde-fou cosa sono gli orditi di trama? Un rapido google suggerisce che intendi avvolgere?
NeomerArcana,

No, intendo orditi , ovvero distorcere la trama modificando i cordoni della trama nel tempo.
Massimo

Vedi questa domanda correlata . Non penso che sia abbastanza un duplicato, dal momento che la domanda collegata sta chiedendo di più su come funzionano queste funzioni / come sono calcolate, invece di un livello superiore "che cos'è questo e a cosa serve?"
DMGregory

Ciao, sono molto interessato a questo, al momento li sto usando per eseguire il bump mapping senza tangente o bitangente, ma sostanzialmente ho incollato il codice. ... Stavo pensando di usarlo per quello ... ma non so come trasformare questi derivati ​​dello spazio dello schermo in normali dello spazio del mondo usando un'algebra lineare economica. Forse ho bisogno dell'inverso della matrice di proiezione della fotocamera.
Prokop Hapala,

Risposte:


12

In primo luogo, aiuta a sapere che le GPU valutano sempre frammenti / pixel shader su 2x2 blocchi di pixel alla volta. (Anche se alla fine solo alcuni di quei pixel devono essere disegnati, mentre altri sono al di fuori del poligono o occlusi - i frammenti non necessari vengono mascherati invece di essere scritti alla fine).

Diagramma che illustra i derivati ​​in un triangolo rasterizzato

La derivata dello spazio dello schermo di una variabile (o espressione) vnel tuo shader è la differenza nel valore di v(in quel punto del codice) da un lato all'altro di questo quad 2x2 pixel. vale a dire. ddxè il valore di vnel pixel destro meno il valore di va sinistra, e allo stesso modo per ddyin verticale.

Questo risponde "quanto velocemente vaumenta o diminuisce mentre ci muoviamo orizzontalmente (ddx) o verticalmente (oscuro) attraverso lo schermo?" - ie. in termini di calcolo, approssima le derivate parziali della tua variabile (approssimativa perché utilizza campioni discreti in ciascun frammento, piuttosto che valutare matematicamente il comportamento infinitesimale della funzione)

Per quantità scalari, possiamo anche vedere questo come un vettore gradiente ∇v = float2(ddx(v), ddy(v)) che punta lungo la direzione dello spazio dello schermo in cui vsta aumentando più rapidamente.

Questo tipo di informazioni viene spesso utilizzato internamente per selezionare una mipmap appropriata o un kernel di filtro anisotropico per le ricerche di texture. Ad esempio, se la mia fotocamera sembra quasi parallela alla uvdirezione verticale di un piano del pavimento strutturato, ddy(uv.y)sarà molto grande rispetto a ddx(uv.x)(poiché l'asse verticale è scorcio sullo schermo - un passo di pixel copre verticalmente un tratto più lungo di spazio di trama), che dice all'hardware di campionamento delle trame che ho bisogno di un filtro anisotropico per sfocare la direzione della trama verticale più di quella orizzontale per evitare artefatti di aliasing.

Per la maggior parte degli effetti semplici non è necessario utilizzare questi derivati, poiché i metodi di campionamento di trama 2D di base lo gestiscono per te. Ma come menziona Le Comte du Merde-fou in un commento sopra, quando stai distorcendo le tue ricerche di texture potresti aver bisogno di recuperare e / o massaggiare manualmente i derivati ​​dello spazio dello schermo da usare, per aiutare l'hardware a selezionare il filtro appropriato (es. Via tex2Dlodin HLSL)

Le decalcomanie dello spazio sono uno di questi casi, in cui un singolo blocco 2x2 può coprire una grande discontinuità di salto nella coordinata della trama calcolata, portando a un bordo macchiato o con alias se si lascia che il sistema calcoli il livello di filtraggio in modo ingenuo. Questo articolo approfondisce questo manufatto e si avvicina per mitigarlo .

Questi derivati ​​possono anche essere utili quando si utilizzano le funzioni di rumore nella generazione di texture procedurali. Se, diciamo, volevi trasformare il rumore procedurale in una normale mappa, ddx e ddy forniscono un modo semplice, seppure approssimativo, per calcolare come il valore del rumore sta cambiando in prossimità del frammento corrente e in che modo è inclinato, quindi può costruire un normale appropriato.

Le tecniche per il rendering di linee con antialias o evidenziazione delle intersezioni possono anche utilizzare le derivate dello spazio dello schermo, per garantire che lo spessore / decadimento sia coerente e non dipendente dalla geometria o dall'angolo di vista.

In questo discorso sul rendering della sabbia in Journey , l'oratore menziona che avrebbero potuto usare queste funzioni derivate per controllare la brillantezza della sabbia lungo i bordi di uno sguardo ... se in quel momento li avessero conosciuti (invece hanno usato un trucco per mipmapping, che sotto il cofano è comunque alimentato da questo tipo di derivati)

Un'ultima nota da tenere presente: i derivati ​​dello spazio dello schermo possono essere calcolati con precisione "grossolana" / bassa (il che significa che una coppia di derivati ​​è condivisa da tutto il quad) o "fine" / alta precisione (il che significa che ogni pixel viene confrontato solo con la sua immediata vicini nel quadrante, che potrebbe dare quattro distinte coppie di derivate sul quadrante). Generalmente è grossolana, ma se noti che stai ottenendo blocchi 2x2 visibili nel tuo effetto, è un buon indizio che vuoi passare alla precisione fine / alta. ;)

(Nel diagramma in alto ho usato i calcoli per i derivati ​​fini, ma attenzione che solo ddx / ddy per conto proprio potrebbe diventare predefinito per i derivati ​​grossolani)


Quando dici che è la differenza tra i pixel da un lato del blocco 2x2 all'altro, è la differenza nel valore dei pixel o la differenza nella posizione del texel? Se è la differenza di valore, riassume i texel tra o qualcosa del genere?
NeomerArcana,

È la differenza nel valore dell'argomento ( vqui) e poiché è un quad 2x2, non ci sono pixel in mezzo. Quindi, se ombreggiamo il frammento in alto a sinistra del quad, e v = 1 lì, e nel frammento in alto a destra v = 4, allora ddx (v) = 3 (dicendo "v aumenta di 3 mentre ci muoviamo da sinistra a destra ")
DMGregory

Ancora non capisco bene. Se sto visualizzando in un angolo, il blocco 2x2 potrebbe non essere costituito da pixel affiancati nella trama. Quindi la differenza di valori, è la differenza tra i due texel selezionati o la differenza tra i due texel selezionati tenendo conto di quelli saltati?
NeomerArcana,

Dimentica i texel: non sta campionando la trama. Sta prendendo il valore letterale dell'argomento passato a ddx o ddy e confrontandolo con il valore passato a ddx o ddy quando si valuta il frammento vicino. Se quel valore proviene da un campione di trama, così sia, ma le funzioni derivate non hanno alcuna conoscenza delle trame. Sottraggono solo numeri. Proverò ad aggiungere un diagramma a questa risposta una volta tornato sul mio PC.
DMGregory

Oh, penso di capire adesso. Sarebbe bello avere un diagramma ma penso di aver capito. Queste sembrano funzioni molto utili.
NeomerArcana,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.