Così stavo esaminando il libro arancione (terza edizione) e ho trovato un passaggio nel capitolo 9 sul qualificatore invariante. E dice:Confusione circa il qualificatore invariante OpenGL
L'invariante qualificatore istruisce il compilatore e collegato ad ignorare le espressioni e le funzioni che non sono direttamente legate al calcolo della produzione.
Questo passaggio viene dopo due frammenti simili del codice:
uniform mat4 MVPmatrix;
// ...
in vec4 MCVertex;
// ...
a(); // does not modify gl_Position, MVP or MCVertex
// ...
// Transform vertex to clip space
gl_Position = MVP * MCVertex;
e
uniform mat4 MVPmatrix;
// ...
invariant gl_Position;
in vec4 MCVertex;
// ...
a(); // does not modify gl_Position, MVP or MCVertex
// ...
// Transform vertex to clip space
gl_Position = MVP * MCVertex;
Il libro passa poi a stato:
Il primo caso può o potrebbe non calcolare le posizioni trasformate esattamente allo stesso modo, indipendentemente dalla funzione non correlata o l'espressione è collegata allo shader. Ciò può causare problemi nel rendering se si utilizza un algoritmo multipass per eseguire il rendering della stessa geometria più di una volta.
Quale mi ha confuso. Se a()
non influisce in alcun modo sulle variabili coinvolte nel calcolo della posizione trasformata, in che modo il calcolo varia? (E in che modo esattamente l'aggiunta di invariant
aiuta con quello?). E riferendosi alla prima citazione, cosa intendono esattamente con "ignorare le funzioni non correlate"? Non vengono semplicemente giustiziati?
Non penso che questo risponda all'origine due domande. e la citazione non blocca né – suitianshi
@suitianshi: l'OP voleva capire l'invariante, e ha continuato a sezionare ciò che il libro arancione aveva da dire al riguardo. Il contenuto del libro arancione può essere sostanzialmente considerato sbagliato. Così ho scelto di rispondere dalla fonte originale, la specifica GLSL. Le domande originali stanno cercando di capire le affermazioni sbagliate. Quale risposta corretta vorresti? – Bahbar
ho trovato una pagina che descrive il motivo per cui avremmo bisogno di un "invariante" a volte. Dice che il problema del multi-pass può essere causato dal riordino delle istruzioni della cpu (e qualcos'altro, mi spiace non ricordarlo chiaramente e non riesco a trovare di nuovo il contenuto). Ad esempio, se eseguo il rendering di un triangolo due volte con gli stessi programmi shader, ma durante i due passaggi ottengo il sonno o faccio shopping, i due triangoli risultanti potrebbero non sovrapporsi (ovviamente, l'offset può essere veramente piccolo). In realtà ho letto le specifiche GLSL, ma sono ancora confuso. – suitianshi