2013-07-25 26 views
9

ARB_texture_storage è stato introdotto nel core OpenGL 4.2.Cosa significa texture immutabile?

Puoi spiegare cosa significa immutabilità per gli oggetti texture?

Perché è meglio l'utilizzo della trama precedente e quali sono gli svantaggi di questa funzionalità?

So che posso leggere le specifiche di questa estensione (cosa che ho fatto :)), ma mi piacerebbe vedere alcuni esempi o altre spiegazioni.

+7

"* quali sono gli svantaggi di questa funzionalità? *" Il fatto che non fosse in OpenGL 1.1. –

+0

possibile duplicato di [Che cosa fa glTexStorage?] (Http://stackoverflow.com/questions/9224300/what-does-gltexstorage-do) –

+0

Fondamentalmente risolve i difetti di progettazione in OpenGL. A parte pochissime caratteristiche veramente interessanti, la maggior parte della moderna OpenGL riguarda il cambiamento dell'API piuttosto che fornire nuove funzionalità. il fatto è che ora abbiamo un'idea precisa delle funzionalità della GPU (ancora spazio per le nuove cose eh XD) e abbiamo bisogno di API migliori e più coerenti per fornire le capacità agli utenti. – GameDeveloper

risposta

15

Basta leggere l'introduzione della proroga stessa:

The texture image specification commands in OpenGL allow each level 
to be separately specified with different sizes, formats, types and 
so on, and only imposes consistency checks at draw time. This adds 
overhead for implementations. 

This extension provides a mechanism for specifying the entire 
structure of a texture in a single call, allowing certain 
consistency checks and memory allocations to be done up front. Once 
specified, the format and dimensions of the image array become 
immutable, to simplify completeness checks in the implementation. 

When using this extension, it is no longer possible to supply texture 
data using TexImage*. Instead, data can be uploaded using TexSubImage*, 
or produced by other means (such as render-to-texture, mipmap generation, 
or rendering to a sibling EGLImage). 

This extension has complicated interactions with other extensions. 
The goal of most of these interactions is to ensure that a texture 
is always mipmap complete (and cube complete for cubemap textures). 

gli evidenti vantaggi sono che l'attuazione può rimuovere controlli di completezza/coerenza in fase di esecuzione, e il codice è più robusto, perché non è possibile creare accidentalmente un trama sbagliata.


Elaborare: "immutabile" qui significa che l'archiviazione trama (uno dei tre componenti di una texture: stoccaggio, prelievo, i parametri) viene assegnato volta ed è già completa. Si noti che per archiviazione non si intende il contenuto della memoria - possono essere modificati in qualsiasi momento; si riferisce al processo logico di acquisizione di risorse per quei contenuti (come un malloc).

Con trame non immutabili, è possibile modificare la memoria in qualsiasi momento, mediante chiamate glTexImage<N>D. Ci sono molti molti modi di sparare in un piede in questo modo:

  • è possibile creare mipmap-incompleta texture (probabilmente l'errore newbie più comune con texture, come texture di default hanno 1000 livelli di mipmap, e la gente caricare una sola immagine)
  • è possibile creare texture con diversi formati in diversi livelli di mipmap (illegali)
  • è possibile creare cubemaps cubemap-incompleti (illegale)
  • è possibile creare cubemaps con diversi formati in diverse facce (illegale)

Dal momento che si è permesso di chiamare glTexImage<N>D in qualsiasi momento, l'attuazione deve sempre controllare, in sorteggio tempo, che la texture è legale. Lo storage immutabile fa sempre la cosa giusta assegnando tutto in una volta (tutti i livelli mipmap, tutte le facce cubemap, ecc.) Con il formato corretto. Quindi non puoi più rovinare una texture (facilmente) e l'implementazione può rimuovere alcuni controlli, il che accelera le cose. E tutti sono felici :)

+0

grazie per il caso.Vedo che in generale questa estensione riduce la complessità e dovrebbe migliorare la velocità. Quando hai una texture semplice caricata da un disco dovresti usare TexStorage2D per fare tutto il lavoro in anticipo. – fen

+2

@fen * "Quando hai una texture semplice caricata da un disco" * - No, dovrebbe leggere * "Quando hai una texture" *. –