Condividi tramite


Conversione dei dati per lo spazio colore

Per comporre lo schermo o eseguire operazioni a virgola mobile, è necessario lavorare nello spazio dei colori corretto. È consigliabile eseguire operazioni a virgola mobile in uno spazio colore lineare. Quindi, per presentare le immagini sullo schermo, convertire i dati in dati RGB standard (sRGB, gamma 2.2-corretto) spazio colore. La presentazione sullo schermo nello spazio dei colori sRGB è importante per l'accuratezza del colore. Se le immagini non sono corrette in gamma 2.2, allocano troppi bit o troppa larghezza di banda per evidenziare che gli utenti non possono distinguere e troppi bit o larghezza di banda per nascondere i valori sensibili alle persone e quindi richiedono più bit o larghezza di banda per mantenere la stessa qualità visiva. Pertanto, per garantire la migliore precisione del colore, presentare immagini allo schermo che sono gamma 2.2 corrette.

In senso stretto, la funzione di trasferimento sRGB effettiva è una formula a fasi (segmento lineare + 2,4 potenza), che è leggermente diversa da una gamma di potenza raw 2.2. Ma per semplicità, li useremo in modo intercambiabile.

Accuratezza del colore

Per la presentazione, i formati di visualizzazione con valori interi (ad esempio DXGI_FORMAT_B8G8R8A8_UNORM_SRGB, DXGI_FORMAT_R10G10B10_XR_BIAS_A2_UNORM e così via) contengono sempre dati con correzione gamma sRGB. I formati di visualizzazione a valori float (attualmente solo DXGI_FORMAT_R16G16B16A16_FLOAT) contengono dati con valori lineari.

Il modificatore di formato _SRGB indica al sistema operativo per consentire all'app di posizionare i dati sRGB sullo schermo. L'app deve sempre inserire i dati sRGB nei buffer back con formati con valori interi per presentare i dati sRGB sullo schermo, anche se i dati non hanno questo modificatore di formato nel nome del formato. Per un elenco completo dei formati di analisi dello schermo:

Quando si scrivono valori di output a virgola mobile dal pixel shader in visualizzazioni di destinazione di rendering (RenderTargetViews) con il modificatore di formato _SRGB associato alla pipeline, convertirli in spazio colore corretto gamma 2.2. Analogamente, quando le visualizzazioni shader-resource (ShaderResourceViews) con il modificatore di formato _SRGB sono associate alla pipeline, si convertono i valori dallo spazio colore con correzione gamma 2.2 allo spazio colore lineare quando vengono letti dal shaderResourceViews. Lo shader può quindi eseguire operazioni su di esse.

Ad esempio, usare codice simile a questo per scrivere valori di output a virgola mobile da uno shader in un formato RenderTargetView :

struct PSOut
{
    float4 color : SV_Target;
};

PSOut S( PSIn input )
{
    PSOut output;
    output.color = float4( 1.0, 0.0, 0.0, 1.0 );
    return output;
}

Quando viene restituita la routine 'S', i valori a virgola mobile (1, 0, 0, 1) vengono convertiti nel formato RenderTargetView . Quindi, se si assegna il modificatore di formato _SRGB a RenderTargetView, viene eseguita la conversione gamma.

Questi sono i passaggi da seguire per assicurarsi che il contenuto visualizzato sullo schermo abbia la migliore accuratezza del colore.

Per garantire l'accuratezza del colore nella pipeline

  1. Se una trama ha contenuto sRGB, verificare che shaderResourceView abbia il modificatore di formato _SRGB in modo che quando si legge da ShaderResourceView nello shader, si converte il contenuto della trama dallo spazio dei colori con correzione gamma 2.2 allo spazio colore lineare.
  2. Assicurarsi che RenderTargetView abbia anche il modificatore di formato _SRGB in modo che i valori di output dello shader vengano convertiti in gamma.

Se si seguono i passaggi precedenti, quando si chiama il metodo IDXGISwapChain1::P resent1 , il contenuto visualizzato sullo schermo ha la migliore accuratezza del colore.

È possibile usare il metodo ID3D11Device::CreateRenderTargetView per creare visualizzazioni DXGI_FORMAT_*_SRGB sui buffer back da una catena di scambio creata solo con un formato DXGI_FORMAT_*_UNORM. Si tratta di un'eccezione speciale alla regola per la creazione di visualizzazioni di destinazione di rendering, che indica che è possibile usare un formato diverso con ID3D11Device::CreateRenderTargetView solo se è stata creata la risorsa da visualizzare con DXGI_FORMAT_*_TYPELESS.

Per altre informazioni sulle regole per la conversione dei dati, vedi Regole di conversione dei dati.

Per informazioni su come leggere simultaneamente e scrivere in una trama, vedi Decomprimere e comprimere DXGI_FORMAT per la modifica delle immagini sul posto.

Miglioramento della presentazione con il modello di capovolgimento, rettangoli sporchi e aree a scorrimento