Quando OpenGL ha finito con i puntatori nelle funzioni?

OpenGL ha un numero di funzioni che prendono direttamente i puntatori. Alcuni di loro leggono i dati da quei puntatori , altri scrivono i dati su quei puntatori .

Tuttavia, le funzioni OpenGL spesso non vengono eseguite immediatamente. Di solito, quando disegni qualcosa, ci vuole un po ‘prima che il disegno finisca.

Quindi, come faccio a sapere quando OpenGL è finito con un puntatore che gli do?

Tutte le funzioni OpenGL, con l’eccezione indicata di seguito, saranno terminate con qualsiasi puntatore a cui viene assegnato il ritorno di quella funzione. Quindi glReadPixels avrà terminato tutta la lettura dei pixel e la conversione del formato al suo ritorno. Questo è il motivo per cui il trasferimento asincrono dei pixel è così importante per le operazioni di lettura. Permette a OpenGL di non farlo, di non sincronizzarsi con la GPU.

L’unica eccezione a questa regola è ogni funzione che termina con la parola “Puntatore”. Cose come glVertexAttribPointer , glTexCoordPointer e simili. Quando si utilizza la memoria lato client con queste funzioni (non più legale nel profilo principale OpenGL 3.2+), queste funzioni memorizzano un puntatore su quella memoria. Pertanto, è necessario assicurarsi che questo puntatore sia valido fino a quando si intende eseguire il rendering con tali attributi di vertice.

Dopo ogni chiamata di rendering utilizzando la memoria client, OpenGL richiede che l’implementazione abbia terminato la lettura dalla memoria del client al momento del ritorno della funzione di rendering. Quindi puoi chiamare glDrawArrays , quindi eliminare i puntatori in questione. E finché non fai un altro richiamo fino a quando non hai cambiato quei puntatori, stai bene. Ciò significa che OpenGL deve aver copiato tutti i dati dei vertici rilevanti al momento del ritorno della chiamata di rendering (uno dei motivi per cui l’utilizzo degli oggetti buffer è più rapido).