2010-05-06 8 views

risposta

13

Lo stato GL per gli attacchi è un nome di trama per target (ovvero 1D/2D/3D/cubo). Quindi, quando si chiama

glBindTexture(GL_TEXTURE_2D, my2dTex) 
glBindTexture(GL_TEXTURE_1D, my1dTex) 

il GL ricorderà entrambe le impostazioni.

Ora, la risposta di quale GL utilizza dipende dall'avere uno shader attivo.

Se uno shader è attivo, il GL utilizzerà qualsiasi cosa lo shader dice di usare. (basato su sampler1d/sampler2d ...).

Se lo shader non è attivo, dipende innanzitutto da quale chiamata glEnable è stata effettuata.

glEnable(GL_TEXTURE_2D) 
glEnable(GL_TEXTURE_1D) 

Se sia sono abilitati, v'è una regola priorità statica nella specifica (3.8.15 Texture applicazione nelle specifiche GL 1.5).

Cube > 3D > 2D > 1D 

Quindi nel tuo caso, se entrambi i target di trama sono abilitati, verrà utilizzato quello 2D.

Come nota a margine, notare come uno shader non si preoccupa se il bersaglio texture è abilitato ...

Modifica per aggiungere:

E per le persone che vogliono davvero ottenere per i dettagli grintosi, è sempre avere una trama vincolata per ciascun target * ogni unità. Il nome 0 (l'impostazione predefinita per lo stato di associazione) corrisponde a una serie di oggetti trama, uno per obiettivo. glBindTexture(GL_TEXTURE_2D, 0) e glBindTexture(GL_TEXTURE_1D, 0) entrambi legano una trama, ma non la stessa ...

Questo è storico, specificato per corrispondere al comportamento di GL 1.0, in cui gli oggetti texture non esistevano ancora. Non sono sicuro di cosa abbia fatto la deprecazione in GL3.0 con questo.

0

Penso che verrà disegnata la trama 1d. Per quanto ne so, ogni unità di texture può avere solo una trama vincolata alla volta. Il numero di dimensioni della trama in realtà non entra in esso.

di avere più di una trama legata è necessario attivare più di un'unità di struttura (utilizzando glActiveTexture), in questo modo:

glActiveTexture(GL_TEXTURE0); 
glBindTexture(GL_TEXTURE_2D, my2dTex); 
glActiveTexture(GL_TEXTURE1); 
glBindTexture(GL_TEXTURE_1D, my1dTex); 

Questo viene da mia conoscenza di OpenGL 2.1, però, quindi per favore correggetemi se hanno introdotto alcune fantastiche nuove estensioni di texture in una versione successiva!

+0

Scusa, pensi male. Bahbar fornisce la risposta corretta. – Thomas

+0

Bene, ho imparato qualcosa di nuovo oggi. Questo mi insegnerà a rispondere quando non ho a portata di mano il mio libro OpenGL! –

0

La trama applicata è l'ultima specificata con la routine BindTexture.

Dalla specifica:

Il nuovo oggetto tessitura legato a obiettivo è, e rimane una texture della dimensionalità e tipo specificato dal bersaglio fino a quando non viene eliminato. .... Se il binding di viene eseguito correttamente, non viene apportata alcuna modifica allo stato dell'oggetto texture associato, e , qualsiasi collegamento precedente a destinazione è stato risolto.

Infatti nel tuo esempio verrà applicata la trama 1D, poiché "sovrascrive" lo stato dell'unità di trama attiva.

+1

la parola destinazione qui si riferisce a _1D o _2D. ci sono 2 diversi obiettivi coinvolti in questo caso. – Bahbar

+1

'GL_TEXTURE_1D' e' GL_TEXTURE_2D' sono obiettivi diversi. – Thomas

+0

Ok, ho capito * dopo * aver letto la risposta Bahbar (mancata prima di apportare modifiche!). Buon punto Sempre dimenticando il paradigma Abilita/Disabilita da quando si usa sempre il linguaggio di ombreggiatura ... – Luca