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.
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
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
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