2014-12-20 20 views
5

Quindi stavo leggendo "The Official OpenGL Guide" e in una sezione in cui hanno insegnato l'illuminazione dei materiali, hanno improvvisamente utilizzato il qualificatore "flat" per una variabile di input nello shader di frammenti. Ho cercato di risolvere il problema e tutto ciò che è venuto fuori è stato "ombreggiatura piatta" e "sfumatura uniforme" e le differenze tra di loro, che non riesco a capire come sia correlata a una semplice variabile "MatIndex". ecco il codice di esempio dal libro:qualificatore "piatto" in glsl?

struct MaterialProperties { 
vec3 emission; 
vec3 ambient; 
vec3 diffuse; 
vec3 specular; 
float shininess; 
}; 
// a set of materials to select between, per shader invocation 
const int NumMaterials = 14; 
uniform MaterialProperties Material[NumMaterials]; 
flat in int MatIndex; // input material index from vertex shader 

Che cosa è questa storia?

risposta

16

Nel caso generale, non esiste una mappatura 1: 1 tra un vertice e un frammento. Per impostazione predefinita, i dati associati per vertice vengono interpolati sulla primitiva per generare i corrispondenti dati associati per frammento, che è ciò che fa l'ombreggiatura liscia.

Utilizzando la parola chiave flat, non viene eseguita alcuna interpolazione, quindi ogni frammento generato durante la rasterizzazione di quella particolare primitiva riceverà gli stessi dati. Poiché i primitivi sono generalmente definiti da più di un vertice, ciò significa che in questo caso vengono utilizzati i dati di un solo vertice. Questo è chiamato il provoking vertex in OpenGL.

Si noti inoltre che i tipi di intero non vengono mai interpolati. Si deve dichiararli come flat in ogni caso.

Nel tuo esempio specifico, il codice indica che ogni primitivo può avere solo un materiale, che è definito dall'ID materiale del vertice provocante di ciascuna primitiva.

+0

Scusa, ma cosa significa "interpolazione" nel nostro contesto? L'inglese non è la mia lingua madre e quando cerco di ottenere la traduzione nella mia lingua ottengo "interpolatsia", che è la stessa parola. = [ – Pilpel

+3

@Pilpel: [interpolazione] (https://en.wikipedia.org/wiki/Interpolation) è un concetto generale con cui dovresti familiarizzare quando vuoi fare grafica. Con l'interpolazione, in genere si dispone di un set di punti dati e si tenta di generare valori per tra i punti dati specificati. In questo contesto, abbiamo dati per vertice e dobbiamo interpolarlo per frammento. Immagina un triangolo con colore per vertice.Per il vertice A, specifichiamo il rosso, per il vertice B, specifichiamo il verde e per il vertice C, specifichiamo il blu. L'interpolazione genera sfumature di colore uniformi su tutto il triangolo. – derhass

3

Fa parte del modo in cui l'attributo viene interpolato per lo shader di frammenti, il valore predefinito è un'interpolazione di prospettiva corretta.

nel GLSL spec section 4.5

Una variabile qualificata come piatto non viene interpolata. Invece, lo avrà lo stesso valore per ogni frammento all'interno di un triangolo. Questo valore proviene da un singolo vertice di provocazione, come descritto dalla Specifica di sistema grafico OpenGL . Una variabile può essere qualificato come piatta possono anche essere qualificati come centroide o campione, che ha lo stesso significato come qualificare solo come piatto

attributi integrali devono essere piatta.

È possibile trovare la tabella di cui vertice è il vertice di provocazione nella tabella 01.13.2 nella sezione 13.4.