2012-10-25 15 views
16

OK, quindi queste trame mi stanno davvero confondendo. Ho esaminato il tutorial this (che ritengo sia ottimo), in particolare l'immagine con la didascalia "È possibile definire fino a 32 unità di trama, ma solo fino a 8 trame per shader.". A quanto ho capito, ecco come funziona:OpenGLES 2 - quando applicare glBindTexture e quando applicare glActiveTexture?

Si attiva un'unità di trama. Quindi leghi un oggetto texture (analogo ai cubi 'Texture Data' nell'immagine) a un determinato bersaglio all'interno di quell'unità. Quindi, glGenTextures per rendere gli oggetti & i loro nomi, e poi glBindTexture per legare quella texture a TEXTURE_2D o qualcosa del genere (non sono interessato ad altri target al momento). Quindi puoi specificare i dati della trama con glTexImage2D.

Ora. Sto usando 3 programmi shader, ognuno con diverse texture richieste. Ecco quello che voglio fare:

In una fase di inizializzazione, io passare attraverso ciascuno dei miei unità texture, e andare

  • glActiveTexture
  • glBindTexture (opera su unità di tessitura attivo)
  • glTexImage2D (funziona su oggetto attualmente collegato)

e per gli ombreggiatori, ho un aspetto uniforme per abbinare un'uniforme in ogni shader al valore "i" specificato in GL_TEXTUREi di glActiveTexture. Ho bisogno di un totale di solo quattro trame e sono piuttosto piccole.

Ora, durante il rendering, dovrei essere in grado di passare i programmi bene, e tutto funziona, giusto? Ogni programma ha già un'uniforme che specifica quale unità usare, e ogni unità ha già un oggetto associato al suo target TEXTURE_2D, e ogni oggetto ha dati specificati da glTexImage2D, giusto? Quindi nessuna unità vincolante o attivante richiesta nella mia funzione di rendering? Almeno è così che l'ho capito, ma sto prendendo le trame sbagliate disegnate nei posti sbagliati.

Inoltre, in uno dei miei programmi voglio passare tra tre trame per una singola superficie. Così ho pensato di caricare ciascuna delle trame in un oggetto, e legare ciascuno degli oggetti a un'unità, quindi al momento del rendering posso semplicemente glUniform per dire al programma quale unità di texture usare.

Quindi mi chiedo se ho frainteso la struttura fondamentale di texturing in OpenGL, o se i binding di oggetti alle unità scadono quando i programmi sono cambiati, o qualcosa del genere. O se devo legare una texture più volte - ma quando e perché?

+1

Mi sembra che tu abbia l'idea giusta, non vedo il difetto. Forse potresti inserire l'esempio ** minimale in cui hai disegnato trame errate, in modo che possiamo vedere se non hai fatto un errore? – Tim

+1

Ho esaminato questa domanda quando stavo riscontrando un problema simile. Il mio problema era dovuto a una variabile statica che non avrebbe dovuto essere statica. Sto sviluppando per iOS e sono riuscito a capirlo usando il debugger OpenGL in Xcode. Non so se sei su iOS, ma se hai appena iniziato con i tutorial, ho pensato che sarebbe stato utile indicare questo debugger: http://developer.apple.com/library/mac/#recipes/ xcode_help-debugger/articles/debugging_opengl_es_frame.html – GingerBreadMane

+0

@Shitesh - hai mai risolto il tuo problema? – nbubis

risposta

11

Non dimenticare di impostare glTexParameteri per ciascun oggetto texture.

void loadTextures() { 
    GLint texture_object_handles[3]; 
    glGenTextures(3, texture_object_handles); 

    for (int i = 0 ; i < 3 ; ++i) { 
     glActiveTexture(GL_TEXTURE0 + i); 
     glBindTexture(GL_TEXTURE_2D, texture_object_handles[i]); 
     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 
     glTexImage2D(GL_TEXTURE_2D, ...); 
    } 
    return; 
} 


void draw() { 
    // Draw three different materials without rebinding any textures. 
    for (i = 0 ; i < 3 : ++i) { 
     ... specify other uniforms and attributes 
     glUniform1i(texture_location, i); 
     ... 
     glDrawElements(...); 
    } 
    return; 
}  
+0

Nota che il valore predefinito per MAG_FILTER è GL_LINEAR, quindi non devi impostarlo. – Tim

+0

Grazie. Modificato per rendere l'esempio più conciso. – umlum

Problemi correlati