2012-08-21 21 views
8

Eventuali duplicati:
Explicit vs Automatic attribute location binding for OpenGL shadersPerché dovrei usare glBindAttribLocation?

In un'altra mia domanda una delle risposte indicano devo usare glBindAttribLocation e non permettere al compilatore di ombreggiature per assegnare i propri indici. Mi chiedo perché questa è una pratica raccomandata, quali vantaggi ha (o meglio quali svantaggi non lo utilizzano)?

Capisco che se ho più programmi che condividono attributi questo ha senso, dal momento che posso passare da un programma all'altro e non dover reimpostare quegli attributi. Tuttavia, per gli attributi che non sono condivisi, o se i miei programmi non usano questa condivisione, non vedo che sia necessario associare esplicitamente l'indice.

+0

tl; dr nessun grosso problema. Questa funzione _might_ è utile ma non è una grande cosa. Non riesco a vedere come potrebbe essere una * pratica raccomandata *, fonte? – Kos

+2

Hai già risposto da solo. Così puoi fare in modo che i programmi condividano un paio di attributi predefiniti e puoi cambiare i programmi o persino usarli per oggetti diversi, ecc. In pratica trovo questo un grande vantaggio. – Invalid

+0

Non mi sono preoccupato di usare 'glBindAttribLocation' nel mio motore grafico, che funzionava bene su linux. Quando ho effettuato il porting su windows, utilizzavo le normali come fossero i vertici - dovevo esplicitamente dire l'ordine delle variabili tramite 'glBindAttribLocation' per farlo funzionare ... – Jarrett

risposta

18

Prima di tutto non penso che sia un consiglio generale di utilizzare il binding esplicito tramite glBindAttribLocation​ anziché glGetAttribLocation. Detto questo, questi sono i motivi principali per cui ho smesso di usare glGetAttribLocation:

Prima di tutto, questo può causare un sovraccarico non necessario. Sembra tutto bello e bene che puoi usare nomi leggibili anziché numeri. 'What the heck is attribute 7' vs 'oh right, attribute texture_coordinate': Spiegherò prima cosa può essere l'overhead possibile e quindi perché l'ultima parte non ha senso.

Se è necessaria spesso la posizione dell'attributo, l'overhead della chiamata glGetAttribLocation può diventare non trascurabile, a seconda del driver. Quindi per gestire il caso generale devi costruire un sistema di caching. Ottimo, ecco il mio metodo facile e leggibile con i nomi anziché i numeri, ho appena dovuto scrivere un bel po 'di codice wrapper non banale. Peggio ancora, dovresti davvero fare attenzione a distruggere la cache quando il programma diventa non valido, è molto probabile che lo farai male e finirai con bug. Quindi siamo passati da 'bei nomi leggibili' a 'pasticcio orribile'.

Ancora più, l'argomento dei "nomi leggibili" è errato. Si può perfettamente fare qualcosa di simile alla seguente per le posizioni definite nello shader stesso:

const GLint vertex_loc_att = 0; 
const GLint texture_coord_att = 1; 
... 

Oppure si può anche utilizzare un contenitore associativo come questo:

attribute_locations["vertex_location"] = 0; 
attribute_locations["texture_coordinate"] = 1; 
... 

Questo quello che si può anche combinare con glBindAttribLocation, basta fare questo prima di collegare:

foreach name, location in attribute_locations 
{ 
    glBindAttribLocation(program_id, location, name); 
} 

ancora molto leggibile, senza cache dinamica necessaria, solo alcune variabili statiche che anche potrebbe ottenere ottimizzato via.

Quindi, lo dici tu stesso: ovviamente ha vantaggi quando si utilizzano più programmi, non lo ripeterò qui, perché Kos explained that one in detail already. Rispondo ad uno dei tuoi argomenti:

Attributi che non richiedono condivisione: ciò implica che ci sono anche attributi che devono essere condivisi, per cui è un grande vantaggio che si utilizzano posizioni fisse. Perché dovresti mescolare due approcci di gestione della posizione in un'unica applicazione? Mantieni te stesso da un mal di testa manutenzione e bastone con uno, qui ovviamente le posizioni predefinite perché ne hai bisogno per gli attributi condivisi.

+4

Ha senso che uno vorrebbe anche un' glBindUniformLocation '? Ti sto chiedendo poiché il tuo argomento si applica anche a questo, ma non tale funzione è nello standard. –

+1

La funzionalità glBindUniformLocation è stata aggiunta in 4.3, mediante un'istruzione di layout nello shader: http://www.opengl.org/wiki/Uniform_(GLSL)#Explicit_uniform_location –

Problemi correlati