Solo per quello che sai, questo è lo stesso principio glTexStorage* (...)
. Effettivamente, tu firmi un contratto con l'API che dice che non ti sarà mai permesso di cambiare certe proprietà del tuo oggetto e in cambio ciò conferirà all'oggetto uno status immutabile e ti permetterà di fare cose che normalmente non potresti con esso.
Texture Vista sono un esempio interessante, dove i dati di immagine interni di tessitura immutabile possono essere condivise tra più oggetti texture e anche avere i formato/dimensioni reinterpretato (es 1 fetta di una trama di matrice 2D può essere condiviso e usato come se fosse una normale texture 2D).
Per buffer di vertici, stoccaggio immutabile apre una classe di ottimizzazione delle prestazioni (esempio persistente memoria mappata) che non sarebbe possibile se si potrebbe modificare la dimensione del buffer in qualsiasi momento. Si crea un buffer le cui dimensioni non possono mai essere modificate, ma si è comunque liberi di inviarle nuovi dati in qualsiasi momento usando i comandi glBufferSubData* (...)
o scrivendo nel buffer mentre è mappato in memoria.
Con glBufferData (...)
, è possibile chiamare tale comando più volte sullo stesso oggetto e sarà orfana la vecchia memoria e allocare nuova memoria. Con glBufferStorage (...)
, la dimensione del buffer è impostata per la durata dell'oggetto (immutabile) ed è un errore (GL_INVALID_OPERATION
) per chiamare di nuovo glBufferStorage (...)
una volta che è stato assegnato immutabilmente.
In breve, è l'archivio dati (caratteristiche di archiviazione) immutabile, non i dati effettivi.
fonte
2015-01-08 12:49:30
È possibile utilizzare NULL per i dati con glBufferStorage. Non puoi ridimensionarlo, quindi devi impostare una dimensione fissa. Puoi usare, come hai sottolineato, il puntatore al buffer mappato per scrivere su di esso, ma i dati non devono essere impostati alla chiamata glBufferStorage. – anthom