2012-11-24 10 views
15

The OpenGL docs for glUseProgram affermare che chiamandolo con un argomento di zero causerà l'esecuzione dello shader da undefined.Cosa fa glUseProgram (0)?

Tuttavia, dopo una piccola ricerca ho visto un paio di esempi di persone che usano glUseProgram a disinstallano il programma corrente di shader.

Questo comportamento è affidabile? In caso contrario, cosa fa esattamente lo glUseProgram(0)?

risposta

20

glUseProgram significa che l'oggetto programma specificato è il programma corrente che verrà utilizzato per cose che utilizzano programmi (glUniform, comandi di rendering, ecc.). 0 è molto simile a NULL per oggetti OpenGL. Rappresenta not an object (per la maggior parte degli oggetti). Pertanto, glUseProgram significa che il programma no è aggiornato e pertanto nessun programma verrà utilizzato per le cose che utilizzano programmi.

Se si tenta di chiamare le funzioni glUniform quando nessun programma è in corso, non riuscirà con un errore. Se si tenta di eseguire il rendering quando nessun programma è corrente, accadrà una delle due cose.

  • In OpenGL 3.1+, il profilo di base, si otterrà un errore di GL_INVALID_OPERATION, perché nucleo OpenGL deve rendering con un programma.
  • In profili di compatibilità o la versione 3.0 o meno, si otterrà il rendering a funzione fissa.
+0

Quindi, in altre parole, non dovrei chiamare 'glUseProgram (0)'? – user11171

+6

@ user11171: No. Dovresti chiamarlo quando non vuoi che un programma sia associato. In tal modo, previeni il rendering accidentale con un programma che non era previsto (ad esempio: hai dimenticato di chiamare 'glUseProgram' con il programma che desideri). Normalmente lo chiamerai quando hai finito il rendering. –

2

Indica a OpenGL di utilizzare la pipeline a funzione fissa.

+1

Si noti che nel profilo principale, non esiste una pipeline a funzione fissa, quindi verrà visualizzato un errore OpenGL ('GL_INVALID_OPERATION') –

+0

----- Note ----- – Aaron

+0

O su alcune macchine, un segfault. – SystemParadox

3

Contrariamente a molte risposte qui e altrove, glUseProgram (0) non è sicuro. È possibile utilizzarlo per impostare lo stato di rendering su un oggetto programma non valido, ma se è ancora associato a questo quando si esegue il rendering, il comportamento è non definito.

Questo può essere utile per evitare di utilizzare il programma errato per errore, ma non dovresti usarlo per indicare "usa la modalità funzione fissa". Nella maggior parte dei casi questo è ciò che accade, ma non è definito dalle specifiche e non dovrebbe essere invocato.

Dal doc:

"Se il programma è zero, allora la corrente stato di rendering si riferisce ad un oggetto programma valido ei risultati dell'esecuzione Shader sono undefined"

Pertanto la i risultati sono interamente specifici per OS, driver e scheda grafica. In molti casi sembra tornare alla modalità a funzione fissa. Tuttavia, potrebbe altrettanto facilmente mantenere l'ultimo shader, rendere la spazzatura o causare un segfault (ho visto accadere questo).

+2

glUseProgram (0) è perfettamente sicuro. Come dice quella pagina, non è un errore chiamare glUseProgram (0); solo per rendere qualsiasi cosa senza un programma vincolato. E questo si applica solo al profilo principale. – rdb

+0

Questa risposta è sbagliata. rdp ha ragione. Chiamare "glUseProgram (0)" non è un'esecuzione shader. Se esegui il rendering dopo aver chiamato "glUseProgram (0)", QUESTA è un'esecuzione dello shader! – Tara

+0

@Dudeson, sei corretto. glUseProgram() non causa l'esecuzione dello shader, ma come dice la specifica, cambia lo stato del rendering in modo che i risultati di qualsiasi esecuzione dello shader (quando in seguito si faccia qualcosa) non siano definiti – SystemParadox

0

Una volta che si utilizza glUseProgram(myShader), tutto il rendering successivo verrà eseguito utilizzando l'ID dello shader myShader.

Se si sta chiamando questo ogni volta che si modifica materiale in un modern openGL 3.1+, c'è poco uso di glUseProgram(0).

Tuttavia, se si sta progettando di integrare un po 'il rendering a funzione fissa in là, come glVertex3f(..), quindi glUseProgram(0) farà in modo che l'ultimo degli shader utilizzato non è più attivo, e utilizzerà la funzione fissa gasdotto, come glColor3f(...)