Condividi tramite


Gamma (Direct3D 9)

Il contenuto della trama viene spesso archiviato in formato sRGB. Tradizionalmente, le pipeline di pixel presupponevano che i colori siano lineari in modo che le operazioni di fusione siano state eseguite nello spazio lineare. Tuttavia, poiché il contenuto sRGB viene corretto, le operazioni di fusione nello spazio lineare produrranno risultati non corretti. Le schede video possono ora risolvere questo problema annullando la correzione gamma quando leggono contenuto sRGB e convertono i dati pixel nel formato sRGB durante la scrittura di pixel. In questo caso, tutte le operazioni all'interno della pipeline pixel vengono eseguite nello spazio lineare.

Correzione gamma

Direct3D 9 può:

  • Indica se una trama è gamma 2.2 corretta o meno (sRGB o meno). Il driver verrà convertito in una gamma lineare per le operazioni di fusione in fase di setTexture oppure il campionatore lo convertirà in dati lineari in fase di ricerca.
  • Indicare se la pipeline pixel deve essere corretta nello spazio sRGB durante la scrittura nella destinazione di rendering.

Tutti gli altri colori (colore chiaro, colore materiale, colore vertice e così via) vengono considerati nello spazio lineare. Le applicazioni possono correggere i colori scritti nel buffer dei fotogrammi usando le istruzioni del pixel shader. La linearizzazione deve essere applicata solo ai canali RGB e non al canale alfa.

Non tutti i formati di superficie possono essere linearizzati. È possibile linearizzare solo i formati che passano CheckDeviceFormat con D3DUSAGE_QUERY_SRGBREAD. Lo stato del campionatore D3DSAMP_SRGBTEXTURE viene ignorato per il resto. È previsto che solo i formati di trama senza segno supportino questa conversione. I formati di trama senza segno includono solo componenti R, G, B e L. Se il canale alfa è presente, viene ignorato. Se i formati misti supportano la linearizzazione sRGB, sono interessati solo i canali non firmati. Idealmente, l'hardware deve eseguire la linearizzazione prima del filtro, ma in Direct3D 9, l'hardware può eseguire la linearizzazione dopo il filtro.

Non tutti i formati di superficie possono essere scritti nello spazio sRGB. È possibile linearizzare solo i formati che passano CheckDeviceFormat con il flag di utilizzo D3DUSAGE_QUERY_SRGBWRITE. Lo stato di rendering D3DRS_SRGBWRITedizione Enterprise NABLE viene ignorato per il resto. Ci si aspetta che otto bit per canale i formati RGB non firmati espongano questa capacità.

Idealmente, l'hardware deve eseguire le operazioni di fusione del buffer dei fotogrammi nello spazio lineare, ma l'hardware è autorizzato a eseguirlo dopo il pixel shader, ma prima del frullatore del buffer dei fotogrammi. Ciò significa che le operazioni di fusione del buffer frame eseguite nello spazio sRGB produrranno risultati non corretti. D3DRS_SRGBWRITedizione Enterprise NABLE viene rispettato durante l'esecuzione di una cancellazione della destinazione di rendering. Per l'hardware che supporta più destinazioni di rendering (Direct3D 9) o Trame a più elementi (Direct3D 9), viene scritto solo il primo elemento o la destinazione di rendering.

Modifiche dell'API

// New sampler state (DWORD)
// If this is nonzero, the texture is linearized on lookup.
D3DSAMP_SRGBTEXTURE       // Default FALSE

// New render state (DWORD)
D3DRS_SRGBWRITEENABLE     // Default FALSE

// New usage flags
D3DUSAGE_QUERY_SRGBWRITE
D3DUSAGE_QUERY_SRGBREAD

Catene di scambio finestrate

È utile per le applicazioni mantenere i buffer nascosto delle catene di scambio nello spazio lineare per consentire operazioni di fusione corrette. Poiché il desktop in genere non è nello spazio lineare, è necessaria una correzione gamma prima che il contenuto del buffer nascosto possa essere presentato. L'applicazione può influire su questa correzione allocando un buffer aggiuntivo ed eseguendo la propria copia di correzione dal buffer lineare al buffer nascosto. Ciò richiede una copia aggiuntiva che può essere evitata se il driver esegue la correzione gamma come parte del blit di presentazione.

In Direct3D 9 un nuovo flag, D3DPRE edizione StandardNT_LINEAR_CONTENT, è disponibile per Present che consente alla presentazione di eseguire la conversione implicita da spazio lineare a sRGB/gamma 2.2. Le applicazioni devono specificare questo flag se il formato backbuffer è a 16 bit a virgola mobile per associare la modalità finestra presente al comportamento gamma a schermo intero, purché venga restituito D3DC piattaforma di strumenti analitici3_LINEAR_TO_SRGB_PREedizione Standard NTATION per le funzionalità del dispositivo recuperate tramite GetDeviceCaps.

Frame Buffer